問題:理解Java里面的必檢異常和非必檢異常
Joshua Bloch在"Effective Java"里面說過
在可恢復的條件下和編程錯誤導致的運行時錯誤時,使用必檢異常(第二版的第52頁)
讓我們來看一下我對這個的正確理解吧
下面是我對必檢異常的理解
try{String userInput = //read in user inputLong id = Long.parseLong(userInput);
}catch(NumberFormatException e){id = 0; //通過設置ID為0,來恢復這種情況
}
1.上面的代碼是否能被看作必檢異常
2.運行時異常是一個非必檢異常嗎?
下面是我對非必檢異常的一些理解
try{File file = new File("my/file/path");FileInputStream fis = new FileInputStream(file);
}catch(FileNotFoundException e){//3. 這里我應該干什么//我應該 "throw new FileNotFoundException("File not found");"?//應該寫日志嗎?//或者應該 System.exit(0);?
}
- 現在看來,上面的代碼也不可能是一個必檢的異常了?我可以嘗試像這樣恢復嗎?(注意:我的第三個問題在上面代碼的catch那里)
try{String filePath = //read in from user input file pathFile file = new File(filePath);FileInputStream fis = new FileInputStream(file);
}catch(FileNotFoundException e){//友好地提升用戶一個錯誤信息//以某種方式要求用戶重新輸入路徑
}
- 為什么我們需要這樣做?
public void someMethod throws Exception{}
為什么要把這個異常拋出?直接處理不是更快更好嗎?
6.我應該直接拋出確切的異常還是使用Exception去覆蓋掉他
回答一
是不是必檢異常和你是否捕捉和你在捕獲異常的代碼塊里面干了什么無關。它是異常類的一種屬性。任何異常都是Exception類的一個子類(除了運行時異常)并且它的子類都是必檢異常
Java的編譯器強制要求你捕獲異常或者在方法簽名那個聲明。它們可以用來提高程序的安全性,但是大部分人認為它不會帶來程序設計上的問題
為什么要把這個異常拋出?直接處理不是更快更好嗎?
因為這是異常的完整內容。如果沒有這種可能性,你就不需要這些異常了。它們能夠讓你在你選擇的層級去處理異常,而不是強制讓你在異常發生的底層級的方法里處理這些異常
文章翻譯自Stack Overflow:https://stackoverflow.com/questions/6115896/understanding-checked-vs-unchecked-exceptions-in-java