我是 Java 新手,我讀到只有在編譯時才會引發受檢例外,即如果存在未處理或拋出的受檢例外,程式將無法成功編譯。如果某些東西阻止編譯器編譯代碼,那么我們可以洗掉它或以另一種方式重新編碼,這樣問題就不存在了。
例如,如果我們試圖打開系統中不存在的檔案,我們不應該只打開它。那么為什么需要處理/拋出這些例外呢?
uj5u.com熱心網友回復:
您在這里的概念問題是您將編譯時發生的事情與運行時發生的事情混為一談;即當程式由程式員編譯和由用戶運行時。
在編譯時,編譯器分析程式以確定可能拋出的例外。例如
public static void main(String[] args) {
FileInputStream fis = new FileInputStream(args[0]); // HERE
}
構造FileInputStream(String)函式被宣告為throws IOException. (查一下。)所以編譯器知道 at 的陳述句HERE 可能會拋出一個IOException. 并且IOException是一個檢查例外。(查一下。)
它不知道它會。它不可能知道它會……因為它不知道args[0]會包含什么。這僅在運行時才知道;即當程式運行并且用戶提供一些命令列引數時。
問:檢查例外在這里是什么意思?
好吧,這意味著該main方法要么必須宣告為 (for example) throws IOException,要么必須在try-catch陳述句中捕獲它。
問:那么為什么是已檢查例外?
因為它是這樣宣布的!
問:為什么會這樣宣布?
強制程式員處理正在打開的檔案不存在、不可讀等可能性。當程式(最終)運行時。
編譯器說“對可能發生的事情做點什么……”。
只是重申一下。編譯器無法檢查檔案是否存在,因為它不知道用戶將提供什么路徑名。即使它確實知道,并且它檢查了1該檔案在編譯時是否存在,它也不知道該檔案是否會在運行時仍然存在,可能在不同網路上的完全不同的機器上......很多年未來。
1 - 這是假設的。它不檢查。這將毫無意義。
uj5u.com熱心網友回復:
您不應將例外處理視為問題,而應將其視為一項功能。
假設不存在例外。
var file = new File("test.txt");
if (!file.exists()) {
file.createNewFile();
}
var writer = new FileWriter(file);
// ...
會出什么問題?
- 在檢查檔案是否存在和打開閱讀器之間,檔案可能已被另一個執行緒/行程洗掉。因此,即使您創建了它,它也消失了->您需要以某種方式鎖定檔案
- 您的記憶體已滿,因此無法創建檔案 -> 您需要檢查結果
createNewFile。 - 該檔案存在,但是是一個目錄。
- 該檔案被鎖定,因為另一個行程正在寫入它->您需要檢查它是否正在被寫入。
這樣就可以了(仍然假設沒有例外):
var file = new File("test.txt");
if (!file.exists()) {
if(file.createNewFile()) {
if (!file.isDirectory()) {
if (!isUsed(file)) {
var writer = new FileWriter(file);
// ...
}
}
}
}
這是很多代碼,但仍然無法處理第一個問題。
然而
var file = new File("test.txt");
try {
var writer = new Filewriter(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
更短,更清晰,更容易理解。
此外,通常情況下,如果發生任何這些問題,一切都更有可能正常作業。因此,與其假設所有最壞的情況并事先進行多次檢查,不如假設最好的情況,如果出現問題,您會尋找原因。
這也會影響運行時。如果您運行無例外代碼 1000 次,所有這些檢查將運行 1000 次,無論它們是否失敗。對于例外代碼,情況并非如此,可能根本不會運行。
uj5u.com熱心網友回復:
Java中的檢查例外必須被處理,這就是編譯器會抱怨并且沒有編譯代碼的原因。
但是例外本身直到運行時才會引發,以防萬一。
當您撰寫代碼時,您應該正確處理所有已檢查的例外,因此您必須撰寫一個try catch塊或僅從方法中回傳例外。
如果你使用一些引發檢查例外的庫,你可以用我已經解釋過的兩種方式之一來處理。
但是在您的代碼中,您可以選擇使用未經檢查的例外。
可以忽略這些例外,編譯器會很好。當然,如果在執行時引發了其中一個未經檢查的例外并且沒有被捕獲,您的應用程式將會崩潰。
但這在某些情況下可能是可取的,因為沒有正確的方法來處理例外,它通常是Error.
無論如何,您不應該考慮如何處理代碼中的錯誤情況,而只考慮例外。
更多:例外類、錯誤類
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/426257.html
上一篇:如何檢測裝飾器中缺少的引數?
下一篇:使用selenium和請求下載影像:為什么WebElement的.get_attribute()方法回傳base64格式的URL?
