6 回答

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超10個(gè)贊
如果您忘記了new
以下情況,您也會(huì)收到此錯(cuò)誤:
String s = String();
與
String s = new String();

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超6個(gè)贊
“變量超出范圍”的另一個(gè)例子
正如我已經(jīng)看過(guò)幾次這樣的問(wèn)題,也許還有一個(gè)例子,即使它可能感覺(jué)不錯(cuò)也是非法的。
考慮以下代碼:
if(somethingIsTrue()) {
String message = "Everything is fine";
} else {
String message = "We have an error";
}
System.out.println(message);
這是無(wú)效的代碼。因?yàn)槊淖兞慷疾辉趍essage其各自的范圍之外可見(jiàn) - {}在這種情況下,這將是周?chē)睦ㄌ?hào)。
你可能會(huì)說(shuō):“但是,一個(gè)名為消息變量定義兩種方式-這樣的消息被后定義if”。
但你錯(cuò)了。
Java沒(méi)有free()或delete運(yùn)算符,所以它必須依賴(lài)跟蹤變量范圍來(lái)找出何時(shí)不再使用變量(以及對(duì)這些原因變量的引用)。
如果你認(rèn)為你做了一件好事,那就特別糟糕了。在“優(yōu)化”代碼之后我看到了這種錯(cuò)誤:
if(somethingIsTrue()) {
String message = "Everything is fine";
System.out.println(message);
} else {
String message = "We have an error";
System.out.println(message);
}
“哦,有重復(fù)的代碼,讓我們拉出那條普通的線路” - >然后就可以了。
處理這種范圍問(wèn)題的最常見(jiàn)方法是將else-values預(yù)先分配給外部作用域中的變量名稱(chēng),然后在以下情況下重新分配:
String message = "We have an error";
if(somethingIsTrue()) {
message = "Everything is fine";
}
System.out.println(message);

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超9個(gè)贊
在Eclipse中獲取此錯(cuò)誤的一種方法:
定義一個(gè)類(lèi)
A
在src/test/java
。B
在src/main/java
該使用類(lèi)中定義另一個(gè)類(lèi)A
。
結(jié)果:Eclipse將編譯代碼,但maven將給出“找不到符號(hào)”。
基本原因:Eclipse正在使用主樹(shù)和測(cè)試樹(shù)的組合構(gòu)建路徑。不幸的是,它不支持為Eclipse項(xiàng)目的不同部分使用不同的構(gòu)建路徑,這是Maven所需要的。
方案:
不要那樣定義依賴(lài)關(guān)系; 即不要犯這個(gè)錯(cuò)誤。
定期使用Maven構(gòu)建代碼庫(kù),以便盡早發(fā)現(xiàn)這個(gè)錯(cuò)誤。一種方法是使用CI服務(wù)器。

TA貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超8個(gè)贊
如果你在其他地方的構(gòu)建中遇到這個(gè)錯(cuò)誤,而你的IDE說(shuō)一切都很好,那么檢查你在兩個(gè)地方都使用相同的Java版本。
例如,Java 7和Java 8具有不同的API,因此在較舊的Java版本中調(diào)用不存在的API會(huì)導(dǎo)致此錯(cuò)誤。

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超7個(gè)贊
可能存在人們上面提到的各種場(chǎng)景。有幾件事幫我解決了這個(gè)問(wèn)題。
如果您使用的是IntelliJ
File -> 'Invalidate Caches/Restart'
要么
被引用的類(lèi)在另一個(gè)項(xiàng)目中,并且該依賴(lài)項(xiàng)未添加到我的項(xiàng)目的Gradle構(gòu)建文件中。所以我添加了依賴(lài)使用
compile project(':anotherProject')
它起作用了。HTH!
添加回答
舉報(bào)