2014-09-13 7 views
11
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) 

उत्तर

11

सार उपकरण/javac:

यह 1.8.0_20 में एक fixed bug था, 1.8.0_11 से:

क्षेत्र javac एक लैम्ब्डा के अंदर बहु ​​पकड़ बयानों के लिए गलत अपवाद तालिका उत्पन्न

लैम्ब्डा के अंदर कई कैच के साथ ट्राइक-कैच की हैंडलिंग को सही किया गया है। अनुवाद और की मैपिंग के दौरान

LTM विलोपन (की एक गहन उपयोग करता):

वास्तविक बग रिपोर्ट 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, 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 
} 
10

इस बग के साथ 1.8.0_20 https://bugs.openjdk.java.net/browse/JDK-8036942

मैं इसे दोहराने के लिए 1.8.0_11 में सक्षम हूँ तय हो गई है और इसके साथ 1.8.0_20

$ 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 

ठीक काम करता है तय हो गई है

~$ javac -version 
javac 1.8.0_20 
$ javac Test.java 
$ 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) 
$ java Test 
right 
संबंधित मुद्दे