Java 从异步运行的lambda访问方法参数

Java 从异步运行的lambda访问方法参数,java,asynchronous,lambda,Java,Asynchronous,Lambda,我知道:只有final或有效地final局部变量可以从lambda内部访问静态变量也可以访问,也可以修改 我不知道的是:为什么这段代码不抛出异常 public static String sampleFunction(String param1, int param2) { new Thread(() -> { try { Thread.sleep(100000); } catch (InterruptedException e) { } // a

我知道:只有
final
或有效地
final
局部变量可以从lambda内部访问<代码>静态变量也可以访问,也可以修改

我不知道的是:为什么这段代码不抛出异常

public static String sampleFunction(String param1, int param2) {
    new Thread(() -> { 
        try { Thread.sleep(100000); } catch (InterruptedException e) { }
        // accessing method parameter here...
        String _param1 = param1;
        System.out.println(_param1);
    }).start();

   return "";
}

public static void Main(String[] arguments) {
    sampleFunction("to print", 9);
    System.out.println("function returned");
}
因此,牢记这一点,参数将在返回时释放 在尝试从异步运行的
lambda
表达式内部访问它们之前,会发生这种情况,为什么它不抛出
异常
?我对代码进行了测试、编译,有趣的是,“返回”消息的打印时间早于“待打印”。
这意味着我可以在方法返回后访问方法参数。

代码不会抛出异常,因为param1实际上是final。Java lambda类似于闭包。

您希望出现哪种异常?我不知道。我只是觉得奇怪,即使在方法返回后,我仍然可以访问方法参数。可能是NullPointerException?当然,lambda无法访问参数
param1
。lambda就像一个对象,它将
param1
的值保存在内部。有趣的是,lambda甚至可以在方法返回后访问方法参数。它执行。