簡體   English   中英

Java 8供應商行為:最終變量可能未初始化

[英]Java 8 supplier behaviour: final variable might not be initialized

Java不允許在供應商內部使用最終變量,因為最終變量可能尚未初始化,但以“(this)”開頭。 變量使其可以編譯並運行良好。

此外,在分配變量之前調用此類供應商會導致NullPointerException而不是編譯器錯誤,並且在調用之后將按預期運行。

是否在某處描述了此行為?

我正在使用OpenJDK 1.8.0_151。

例:

import java.util.function.Supplier;
class Example {
  final String str;

  Supplier<Integer> test1 = () -> str.length();        // DOES NOT COMPILE
  Supplier<Integer> test2 = () -> this.str.length();   // DOES NOT COMPILE
  Supplier<Integer> test3 = () -> (this.str).length(); // DOES NOT COMPILE
  Supplier<Integer> test4 = () -> (this).str.length(); // OK

  Example(String str) {
    System.out.println(test4.get()); // NullPointerException
    this.str = str;
    System.out.println(test4.get()); // OK
  }
}

---

javac Example.java

Example.java:7: error: variable str might not have been initialized
Supplier<Integer> test1 = () -> str.length();        // DOES NOT COMPILE
                                ^
Example.java:8: error: variable str might not have been initialized
Supplier<Integer> test2 = () -> this.str.length();   // DOES NOT COMPILE
                                    ^
Example.java:9: error: variable str might not have been initialized
Supplier<Integer> test3 = () -> (this.str).length(); // DOES NOT COMPILE
                                     ^
3 errors

JLS版本9,第16章開始

在訪問任何值時,每個局部變量(第14.4節)和最后一個空白字段(第4.12.4節,第8.3.1.2節)都必須具有一個明確分配的值。

對它的值的訪問包括變量的簡單名稱(或者,對於字段而言,由其限定的字段的簡單名稱)出現在表達式中的任何位置,但作為簡單賦值運算符=(§ 15.26.1)。

str是最終字段的簡單名稱,而this.str是使用this限定的字段的簡單名稱。 (this).str不會屬於這兩種情況( (this)不算作“由this限定”),因此也不算作訪問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM