Error: 从lambda 表达式引用的本地变量必须是最终变量或实际上的最终变量


报错内容

Error:(15, 36) java: 从lambda 表达式引用的本地变量必须是最终变量或实际上的最终变量
Error:(16, 34) java: 从lambda 表达式引用的本地变量必须是最终变量或实际上的最终变量
Error:(23, 36) java: 从lambda 表达式引用的本地变量必须是最终变量或实际上的最终变量
Error:(24, 34) java: 从lambda 表达式引用的本地变量必须是最终变量或实际上的最终变量

代码示意

public class T01LockSupport {
    static Thread t1 = null ;
    static Thread t2 = null ;
    public static void main(String[] args) {
        char[] chars = GenerateChar.generateChar();
        int[] ints = GenerateChar.generateNumber();
        t1 = new Thread(()-> {
            for (int i = 0; i < chars.length; i++) {
                System.out.print(chars[i]);
                LockSupport.unpark(t2);
                LockSupport.park(t1);
            }
        });
        t2 = new Thread(()-> {
            for (int i = 0; i < ints.length; i++) {
                LockSupport.park(t2);
                System.out.print(ints[i]);
                LockSupport.unpark(t1);
            }
        });
        t1.start();
        t2.start();
    }
}

报错截图:

报错原因

Lambda表达式规则

  • 只能引用标记了 final 的外层局部变量,这就是说不能在 lambda 内部修改定义在域外的局部变量,否则会编译错误。
  • 局部变量可以不用声明为 final,但是必须不可被后面的代码修改(即隐性的具有 final 的语义)
  • 不允许声明一个与局部变量同名的参数或者局部变量。

由Lambda表达式规则第二条可知,局部变量为隐性final!,可以将局部变量移出方法区,变为类变量

解决办法

public class T01LockSupport {
    static Thread t1 = null ;//将Thread t1从方法里面移出到类下
    static Thread t2 = null ;
    public static void main(String[] args) {
        ......
    }
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM