组合lambdas和多catch子句时的Java错误?
import java.io.*;
import java.net.*;
public class Test {
public static void main(String[] arguments) throws Exception {
Runnable runnable = () -> {
try {
throwException();
}
catch (SocketException|EOFException exception) {
System.err.println("wrong");
}
catch (IOException exception) {
System.err.println("right");
}
};
runnable.run();
}
private static void throwException() throws IOException {
throw new NotSerializableException();
}
}
为什么这个程序打印“错”?如果我删除lambda,或者如果我分开了多个catch子句,那么它打印“对”. $javac -version javac 1.8.0_11 $java -version java version "1.8.0_11" Java(TM) SE Runtime Environment (build 1.8.0_11-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.11-b03,mixed mode) 解决方法这是1.8.0_20的 fixed bug,从1.8.0_11:
实际的错误报告是JDK-8036942 实际出错的是编译器中的类型信息丢失:
我在8u20上看到(我忘了给出一个命令行参数,不再有8u20正确地执行): wlan1-loopback% /usr/lib/jvm/java-8-oracle/bin/javap -c Test
Compiled from "Test.java"
public class Test {
public Test();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]) throws java.lang.Exception;
Code:
0: invokedynamic #2,0 // InvokeDynamic #0:run:()Ljava/lang/Runnable;
5: astore_1
6: aload_1
7: invokeinterface #3,1 // InterfaceMethod java/lang/Runnable.run:()V
12: return
}
wlan1-loopback% java Test
right
wlan1-loopback% java -version
java version "1.8.0_20"
Java(TM) SE Runtime Environment (build 1.8.0_20-b26)
Java HotSpot(TM) 64-Bit Server VM (build 25.20-b23,mixed mode)
wlan1-loopback%
正确: public class Test {
public Test();
descriptor: ()V
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]) throws java.lang.Exception;
descriptor: ([Ljava/lang/String;)V
Code:
0: invokedynamic #2,1 // InterfaceMethod java/lang/Runnable.run:()V
12: return
private static void throwException() throws java.io.IOException;
descriptor: ()V
Code:
0: new #4 // class java/io/NotSerializableException
3: dup
4: invokespecial #5 // Method java/io/NotSerializableException."<init>":()V
7: athrow
private static void lambda$main$0();
descriptor: ()V
Code:
0: invokestatic #6 // Method throwException:()V
3: goto 27
6: astore_0
7: getstatic #9 // Field java/lang/System.err:Ljava/io/PrintStream;
10: ldc #10 // String wrong
12: invokevirtual #11 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
15: goto 27
18: astore_0
19: getstatic #9 // Field java/lang/System.err:Ljava/io/PrintStream;
22: ldc #13 // String right
24: invokevirtual #11 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
27: return
Exception table:
from to target type
0 3 6 Class java/net/SocketException
0 3 6 Class java/io/EOFException
0 3 18 Class java/io/IOException
} (编辑:岳阳站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- java之Timer和TimerTask简单demo(分享)
- java – JAXB,CXF:没有ObjectFactory与@XmlElementDecl的元
- java – 在方法调用期间分配和递增值
- java使用servlet实现验证码
- java – 当所有的情况当onSaveInstanceState()方法调用时?
- java-是否有一种简单的方法来使Apache Tomcat在部署后自动重
- java – 如何使用LinkedHashMap中的功能实现ConcurrentHash
- Java中的死锁:发生时
- java – Liquibase看不到实体的变化
- 浅谈java中的TreeMap 排序与TreeSet 排序
