结合lambdas和multi-catch子句时出现Java错误?

结合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

为什么这个程序打印“错误”?如果我删除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

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
}