これは、1.8.0_11 から 1.8.0_20 で修正されたバグです。
エリア: tools/
javac
ラムダ内に複数のキャッチがある try-catch の処理が修正されました。
実際のバグ レポートはJDK-8036942 です。
実際に問題が発生したのは、コンパイラ内で想定される型情報が失われたことです。
LTM は、変数の変換とマッピング中に erasure() を多用します。これらの消去操作は、ほとんどの場合正しいかもしれませんが、このケースが示すように、情報が失われる可能性があります。ほとんど/すべてのタイプを消去することになっている TransTypes の後に LTM が適用されるため、ここでは erasure() のそのような集中的な使用が必要であることも間違いないので、これは TransTypes のバグである可能性があります。LTM の現在のメンテナーである Robert Field によって評価されるべきだと思います。ここでの最善のアプローチは何でしょうか。したがって、彼に再割り当てします。
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, 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
}