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