[英]why intellij complains to add a return to an unreachable statement
我的 IDE 一直抱怨在 catch 塊之后的 hello() 方法中添加“retrun”語句。 那個 return 語句不是無法訪問嗎? 那我為什么要包括它?
import java.sql.SQLException;
public class Test {
public static void main(String[] args) {
hello();
}
public static boolean hello() {
try{
hello2();
} catch(SQLException e){
handleException();
}
return false;
}
public static String hello2() throws SQLException {
throw new SQLException("");
}
public static void handleException(){
throw new RuntimeException();
}
}
那個 return 語句不是無法訪問嗎?
根據JLS規定的判斷語句可達的規則, return false;
聲明是可達的。 (有關詳細信息,請參閱JLS 14.21 1 。)
這些規則不考慮單獨方法的行為。 他們假設任何方法調用都可能返回,無論該方法是如何實際實現的。
如果方法位於單獨的編譯單元中,則 JLS 的假設是必不可少的。 (考慮被調用方法被改變並重新編譯而不重新編譯調用方法的情況。)
在方法邏輯復雜的情況下也是必不可少的。 在某些情況下,編譯器無法確定某個方法是否可以終止; 參見停機問題。 Java 程序的“正確性”取決於編譯器確定任意方法調用是否可以返回的能力,這將是一件壞事。 簡單的解決方案(由 JLS 采用)是編譯器甚至不應該嘗試這樣做......為了可達性檢查。
1 - 請注意,可達性規則與 Java 語言規范第一版中的規則基本相同。
編譯器在編譯hello()
時並沒有分析hello2()
和handleException()
的代碼,所以不知道這些方法總是拋出異常。 因此,它需要在hello()
使用return
語句,因為就編譯器而言,try-catch 塊后面的代碼是可訪問的。
如果您將方法更改為直接拋出異常而不是調用拋出異常的方法,則不需要 return 語句:
public static boolean hello() {
try{
throw new SQLException("");
} catch(SQLException e){
throw new RuntimeException();
}
}
try-catch
簡單地說嘗試問題並解決它並繼續執行進一步的代碼
try{
hello2(); // exception
} catch(SQLException e){ // may occur , handle here
handleException();
}
// normal execution from here
return false;
加上你的hello2()
拋出已經由catch
塊處理的異常,所以編譯器認為所有的可能性,比如如果hello2()
可能不會總是拋出異常(或者編譯器不進入 Netegrity 並假設該方法將返回值,僅當由於代碼的動態行為而無法清楚地預測時),因此它要求該情況下的 return 語句
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.