簡體   English   中英

為什么我的Java try…catch出現錯誤?

[英]Why am I getting errors with my Java try…catch?

我將開始自學更多有關Java錯誤處理的知識,這是我的第一個程序,其中我嘗試查看特定的錯誤,而不是使用catch (Exception e)作為通用的catch-all catch

我正在刪除文件,並返回一條消息,說明該文件已成功刪除或刪除失敗。 在刪除失敗的情況下,如果找不到該文件,我想傳遞一條錯誤消息。

這是我到目前為止的位置:

public static void deleteOldConcatFiles(File concatFile) {
    try
    {
        if(concatFile.delete()) {
            System.out.println(concatFile.getName() + " is deleted!");
        } else {
            System.out.println("Delete operation failed.");
        }
    }
     //
    catch(FileNotFoundException f) {
        System.out.println("Exception: "+ f.getMessage().getClass().getName());
    }
}

運行該命令時,我收到警告: This this is an unreachable catch block for FileNotFoundException. This exception is never thrown from the try statement body. This this is an unreachable catch block for FileNotFoundException. This exception is never thrown from the try statement body.

但是,當我使用此catch塊運行時,

catch(Exception f) {
     System.out.println("Exception: "+e.getMessage().getClass().getName());
}

我沒有收到任何錯誤或警告消息。

為什么會發生這種情況,我該怎么解決?

即使文件不存在, File.delete()也不會引發FileNotFoundException。

FileNotFoundException是一個已檢查的異常(即,不是RuntimeException),因此任何引發該異常的代碼都必須對其進行聲明。 因為File.delete()沒有聲明它拋出FileNotFoundException,所以編譯器保證不會拋出該異常,並可以保證不會調用catch塊。

第二個包羅萬象的塊不會生成警告,因為它還會捕獲RuntimeExceptions(RuntimeException擴展了Exception),編譯器不會為您檢查。 因此,可能會調用它,編譯器不確定,因此不會警告您。

Java支持兩種異常:受檢查的異常(靜態檢查)和未經檢查的異常( RuntimeException及其子類型)。

Java編譯器可以在編譯時告知是否可以拋出已檢查的異常(例如FileNotFoundException )。 對於未經檢查的異常(例如IndexOutOfBoundsException ),它無法分辨。 因此,它將警告嘗試捕獲不會出現的已檢查異常。

如果捕獲到Exception ,它將永遠不會抱怨,因為RuntimeExceptionException的子類型,因此您的嘗試還將嘗試捕獲諸如IndexOutOfBoundsException異常。

正如其他人指出的那樣, delete絕不會拋出FileNotFoundException 此外,這是一個檢查的異常。 因此Java編譯器會抱怨。

因為引發的錯誤類型與您正在捕獲的錯誤類型不匹配。 嘗試這個...

catch(Exception e) {
  System.out.println("Exception: "+ e.getClass());
}

這將顯示您應該捕獲的錯誤類型。 顯然,這不是一個好習慣,但它是查看正在發生的事情的很好的練習。 本頁上有關已檢查和未檢查的異常的其他答案非常簡潔。

如果您在此處查看手冊,則 delete()僅引發SecurityException.

同樣,它返回一個boolean值,該boolean值指示是否刪除了文件。 這應該是向用戶表明是否一切順利的所有信息。

信息不清晰嗎? 當您不構造File對象時,永遠不會在此try塊中引發FileNotFoundException 因此,編譯器會通知您不必要的catch塊。

尋找IOException。 或deleteifExist方法(如果您對異常不感興趣),如果要撤消某些操作,則file.exists()將幫助您確定該文件是否存在。

暫無
暫無

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

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