簡體   English   中英

為什么 intellij 抱怨添加一個無法訪問的語句的返回

[英]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.

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