结合lambdas和multi-catch子句时出现Java错误?
为什么这个程序打印“错误”?如果我删除lambda,或者如果我分解multi-catch子句,那么它将打印“right”结合lambdas和multi-catch子句时出现Java错误?,java,exception,lambda,java-8,multi-catch,Java,Exception,Lambda,Java 8,Multi Catch,为什么这个程序打印“错误”?如果我删除lambda,或者如果我分解multi-catch子句,那么它将打印“right” $javac-version JavaC1.8.0_11 $java-版本 java版本“1.8.0_11” Java(TM)SE运行时环境(build 1.8.0_11-b12) Java HotSpot(TM)64位服务器虚拟机(构建25.11-b03,混合模式) 此错误已通过1.8.0\u 20修复 我可以复制它1.8.0\u 11,它是用1.8.0\u 20 impo
$javac-version
JavaC1.8.0_11
$java-版本
java版本“1.8.0_11”
Java(TM)SE运行时环境(build 1.8.0_11-b12)
Java HotSpot(TM)64位服务器虚拟机(构建25.11-b03,混合模式)
此错误已通过1.8.0\u 20修复
我可以复制它1.8.0\u 11,它是用1.8.0\u 20
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();
}
}
很好
$ 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)
$ javac Test.java
$ java Test
wrong
这是从1.8.0到1.8.0的第20个版本:
区域:工具/javac概要:javac为lambda中的多catch语句生成不正确的异常表 已纠正在lambda内处理多个捕获的try-catch 实际的bug报告是 实际上出错的是编译器中假定的类型信息丢失: LTM在变量的转换和映射过程中大量使用erasure()。这些擦除操作在大多数情况下可能是正确的,但可能会导致信息丢失,如本例所示。也可以说,这里需要大量使用erasure(),因为LTM是在TransTypes之后应用的,而TransTypes本应擦除大部分/所有类型,所以我想知道这是否是TransTypes中的一个bug。我认为应该由罗伯特·菲尔德(Robert Field)进行评估,他是LTM的当前维护者,这里的最佳方法是什么,因此我将把它重新分配给他 我在8u20上看到了什么(我忘了给出命令行参数,不再需要8u20来正确执行它):
wlan1环回%/usr/lib/jvm/java-8-oracle/bin/javap-c测试
从“Test.java”编译而来
公开课考试{
公开考试();
代码:
0:aload_0
1:invokespecial#1//方法java/lang/Object。“:()V
4:返回
publicstaticvoidmain(java.lang.String[])抛出java.lang.Exception;
代码:
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:返回
}
wlan1环回%java测试
正确的
wlan1环回%java-版本
java版本“1.8.0_20”
Java(TM)SE运行时环境(build 1.8.0_20-b26)
Java HotSpot(TM)64位服务器虚拟机(构建25.20-b23,混合模式)
wlan1环回%
正确:
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%
公共类测试{
公开考试();
描述符:()V
代码:
0:aload_0
1:invokespecial#1//方法java/lang/Object。“:()V
4:返回
publicstaticvoidmain(java.lang.String[])抛出java.lang.Exception;
描述符:([Ljava/lang/String;)V
代码:
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:返回
私有静态void throwException()抛出java.io.IOException;
描述符:()V
代码:
0:new#4//class java/io/NotSerializableException
3:dup
4:invokespecial#5//方法java/io/notserializableeexception。”“:()V
7:athrow
私有静态无效lambda$main$0();
描述符:()V
代码:
0:invokestatic#6//方法throweException:()V
3:转到27
6:astore_0
7:getstatic#9//fieldjava/lang/System.err:Ljava/io/PrintStream;
10:ldc#10//字符串错误
12:invokevirtual#11//方法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//右字符串
24:invokevirtual#11//方法java/io/PrintStream.println:(Ljava/lang/String;)V
27:返回
例外情况表:
从到目标类型
0 3 6类java/net/SocketException
0 3 6类java/io/EOFEException
0 3 18类java/io/IOException
}
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, 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
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
}