मैंने जावा 8 विधि संदर्भ का उपयोग करके अनचाहे अपवादों के बारे में कुछ अजीब देखा है। यह लैम्ब्डा अभिव्यक्ति () -> s.toLowerCase()
उपयोग करते हुए मेरे कोड है,:java.lang.NullPointerException को विधि-संदर्भ का उपयोग करके फेंक दिया गया है लेकिन लैम्ब्डा अभिव्यक्ति नहीं
public class Test {
public static void main(String[] args) {
testNPE(null);
}
private static void testNPE(String s) {
Thread t = new Thread(() -> s.toLowerCase());
// Thread t = new Thread(s::toLowerCase);
t.setUncaughtExceptionHandler((t1, e) -> System.out.println("Exception!"));
t.start();
}
}
यह "अपवाद" प्रिंट, तो यह ठीक काम करता है। लेकिन जब मैं Thread t
बदलने के लिए एक विधि-संदर्भ का उपयोग करने के (यहां तक कि इंटेलीजे पता चलता है कि):
Thread t = new Thread(s::toLowerCase);
अपवाद पकड़ा जा रहा है:
Exception in thread "main" java.lang.NullPointerException
at Test.testNPE(Test.java:9)
at Test.main(Test.java:4)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
कोई व्याख्या कर सकते हैं यहाँ क्या चल रहा है?
मैंने अपने स्वयं को ग्रहण में चेक किया है और यह ठीक काम करता है। Ideone.com एनपीई को भी –
फेंक देता है इसे जांचें: https://ideone.com/nPvWex – FaNaJ
लैम्बडास का मूल्यांकन होने पर मूल्यांकन किया जाता है, घोषित किए जाने पर फ़ंक्शन संदर्भों का मूल्यांकन किया जाता है। – njzk2