2

所以我有一個很大的Java應用程序,我在一年前寫了一個,我試着再次理解它。我在代碼中看到了一個明顯有NoSuchElementException的風險的方法:我在一個已經用任意字符串構造的scanner變量上調用.next()。該方法唯一被拋出的是Exception的自定義子類。有風險的命令也不是寫在catch-block中的。代碼編譯和工作正常,當我使用我的貴族以這樣的方式,它應該拋出一個NoSuchElementException什麼也沒有發生:0Java NoSuchElementException

作爲一個測試,我寫了一個catch代碼塊,編譯它,運行gui和使它再次拋出NoSuchElementException,並且應用程序成功地捕獲了異常並相應地執行了操作。我怎樣才能編譯代碼而不指定這個異常可能會被拋出?如果它有什麼用,這裏是沒有追趕的代碼塊:

public static Expression interpret(final Scanner scanner) 
    throws 
    InvalidPosition, 
    NoSuchSpreadsheet, 
    IllegalStartOfExpression, 
    InvalidExpression, 
    FalseSyntax, 
    InvalidRange { 

String keyword = null; 

try { 
    keyword = scanner.next(); 
} catch (NoSuchElementException e) { 
    throw new IllegalStartOfExpression(); 
} 

switch(keyword) { 
    case "Get": 
    Position pos = PositionInterpreter.interpret(scanner.next()); 
    Expression expression = Application.instance.get(pos); 
    if (expression instanceof Text) { 
     System.out.println("Failure"); 
    } else { System.out.println("Success"); } 
    return new Text(expression.toString()); 
    case "Int": 
    return new Int(
     scanner.nextInt()); 

正如你所看到的,方法簡單假設有在掃描儀不止一個詞檢查是否有至少後唯一的那個。我怎樣才能編譯這個?

+0

我沒有看到我的聲明,該方法將引發它獵人,請詳細說明 – user2651804

回答

7

這是因爲NoSuchElementException是未經檢查的例外,這意味着它是「一個」RuntimeException它不會強迫你捕捉。

未經檢查的異常類是RuntimeException類及其子類,以及類Error及其子類。所有其他異常類都是檢查異常類。 Java API定義了許多異常類,既可以選中也可以不選中。額外的異常類,既可以選中也可以不選中,可以由程序員聲明。請參閱ref以獲取異常類層次結構的描述以及由Java API和Java虛擬機定義的一些異常類。

Runtime exceptions與檢查的異常具有相同的用途;向用戶傳達異常情況(意外故障等)。

檢查異常強制調用方法來處理該異常,即使他們不知道如何處理它。通常情況下,開發人員最終會捕獲檢查的異常,只會重新拋出異常(或其他異常)。因此,Runtime exceptions

這裏是異常層次

enter image description here

0

java.util.NoSuchElementExceptionjava.lang.RuntimeException一個子類。 RuntimeException s不必處​​理。從Java API文檔:

RuntimeException是在Java虛擬機正常運行期間可以引發的那些異常的超類。

RuntimeException及其小類未經檢查的例外。未檢查的異常做而不是需要在方法或構造函數的throws子句中聲明,如果它們可以通過執行方法或構造函數拋出並傳播到方法或構造函數邊界之外。

2

由於問題已經回答了,我想指出的,這是設計非常差,而不是Scanner類的預期用途:

try { 
    keyword = scanner.next(); 
} catch (NoSuchElementException e) { 
    throw new IllegalStartOfExpression(); 
} 

什麼你應該做是問掃描儀是否有任何輸入,然後才取回,像這樣:

if(scanner.hasNext()) { 
    keyword = scanner.next(); 
} 
else { 
    throw new IllegalStartOfExpression(); 
} 

這同樣適用於這是造成您的問題行:

if(scanner.hasNextInt()) { 
    return new Integer(scanner.nextInt()); 
} 
+0

這在我看來, 如果(scanner.hasNextInt()){ 返回新的整數(scanner.nextInt()) ; } 是否與簡單的完全相同:return new Integer(scanner.nextInt()); – user2651804

+0

重點在於它只會在掃描器中有一個整數,如果沒有,並且你沒有檢查,你會得到'NoSuchElementException'。 – MrLore

+0

是的,但顯然這個例外根本沒有後果。所以得到它和獲得任何東西之間的區別?我看不到它 – user2651804