相关疑难解决方法(0)

使用方法引用而不是lambda表达式抛出java.lang.NullPointerException

我注意到使用Java 8方法引用的未处理异常有些奇怪.这是我的代码,使用lambda表达式() -> s.toLowerCase():

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

它打印"Exception",所以它工作正常.但是当我Thread t改为使用方法引用时(甚至IntelliJ建议):

Thread t = new Thread(s::toLowerCase);
Run Code Online (Sandbox Code Playgroud)

异常没有被捕获:

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)
Run Code Online (Sandbox Code Playgroud)

有人能解释一下这里发生了什么吗?

java lambda nullpointerexception java-8 method-reference

44
推荐指数
2
解决办法
3597
查看次数

为什么invokeLater在主线程中执行?

我刚刚遇到这个"bug",但我不确定这是不是意图:代码:

public static Object someMethod(){
    assert SwingUtilities.isEventDispatchThread();
    return new Object();
}

public static void main(String[] args){
    SwingUtilities.invokeLater(() -> someMethod().toString());//First Example
    SwingUtilities.invokeLater(someMethod()::toString);//Second Example
}
Run Code Online (Sandbox Code Playgroud)

在第一个例子中someMethod是在swing线程上执行,但在第二个例子中它不是,虽然它应该在我看来.

这是一个错误还是这个?

java lambda multithreading java-8 method-reference

24
推荐指数
2
解决办法
2397
查看次数

System.out :: println的等效lambda表达式是什么

我偶然发现了以下使用方法参考的Java代码 System.out.println

class SomeClass{
    public static void main(String[] args) {
           List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9);
           numbers.forEach(System.out::println);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

什么是等效的lambda表达式System.out::println

java lambda java-8 method-reference

20
推荐指数
2
解决办法
1万
查看次数

为什么在捕获静态字段值时,等效的lambda表达式和方法引用的行为会有所不同?

我对Java lambdas和方法引用行为有点困惑.例如,我们有这个代码:

import java.util.function.Consumer;

public class Main {

    private static StringBuilder sBuilder = new StringBuilder("1");

    public static void main(String[] args) {
        Consumer<String> consumer = s -> sBuilder.append(s);
        sBuilder = new StringBuilder("2");
        consumer.accept("3");
        System.out.println(sBuilder);
    }

}
Run Code Online (Sandbox Code Playgroud)

输出:

23
Run Code Online (Sandbox Code Playgroud)

这可以按预期工作,但如果我们更换

s - > sBuilder.append(s)

sBuilder ::追加

输出将是:

2
Run Code Online (Sandbox Code Playgroud)

你有任何想法如何解释这个?这不是一回事吗?谢谢.

java lambda java-8 method-reference

8
推荐指数
1
解决办法
254
查看次数