新手学java,在什么情况下要包括try catch啊?
我理解的try catch 是处理异常。
难道java有些方法对象 本身就要配合try catch来使用的吗?
黄舟2017-04-18 10:28:06
Java的設計思想,Checked Exception。一旦函數拋出了非運行時異常,那麼就必須在外面呼叫者進行try catch,以確保設計上的異常都能捕捉到進行處理。但是有濫用之勢。
高洛峰2017-04-18 10:28:06
2333,基本上高階程式語言都有TRY CATCH,即使沒有也要想法加上錯誤處理以增加程式的健全性,當然如果你和使用者壓根不在乎出現異常的話也可以不寫。 也可以只在比較關鍵的位置寫。 有時還需要加上事務處理。
ringa_lee2017-04-18 10:28:06
從現今的角度來看,try/catch略顯笨重,尤其是使用底層JDBC的時候(雖然現在這種情況很少了,在做一些非正式的對數據庫的小調整的時候,引入orm是一種不太可取的做法)。到處都是try/catch。而且都是統一的SQLException,要去查底層回傳的code才知道出現了什麼問題。
但是這正是java包容萬象的一個特徵。一個大一點的項目,很多時候都會有不可控的情況,不太可能事事順心。事事都如你所料。一個健壯完善的系統應該有應對一些意想不到的簡單的問題的基礎應對。這是java異常體系建立的初衷。事實上,java允許擴展異常定義,也是為了開發除錯的方便。
在spring出現前,我在給開發團隊搭建架構的時候,都會在業務層和資料庫層引入自訂異常,允許團隊的成員自行擴展,但是需要分享交流,就是應對業務系統中可能出現的先期開發中未考慮到的情況。後來這種模式受到維修人員的一致好評。因為系統出現的80-90%的異常都在我們自訂的異常範圍內,很少出現runtimeexception。尋找問題維護起來非常方便。
天蓬老师2017-04-18 10:28:06
如果沒有try的話,出現異常會導致程式崩潰。而try則可以確保程式的正常運作下去,比如說:
try{
int i = 1/0;
}catch(Exception e){
........
}
一個計算的話,如果除數為0,則會報錯,如果沒有try的話,程式直接崩潰。用try的話,則可以讓程式運作下去,並且輸出為什麼會出錯。 try catch,配合log4j使用會對程式的日後維護幫助很大。
怪我咯2017-04-18 10:28:06
问:新手学java,在什么情况下要包括try catch啊?
答:普及一點基本:
異常的原理機制
當程式中拋出一個異常後,程式從程式中導致異常的程式碼處跳出,java虛擬機偵測尋找和try關鍵字匹配的處理該異常的catch區塊,如果找到,將控制權交到catch區塊中的程式碼,然後繼續往下執行程序,try區塊中發生異常的程式碼不會被重新執行。如果沒有找到處理該異常的catch區塊,在所有的finally區塊程式碼被執行和當前執行緒的所屬的ThreadGroup的uncaughtException方法被呼叫後,遇到異常的當前執行緒被中止。
異常的結構
Java異常結構中定義有Throwable類,Exceotion和Error是其衍生的兩個子類別。其中Exception表示由於網路故障、檔案損壞、設備錯誤、使用者輸入非法等情況導致的異常,這類異常是可以透過Java異常捕獲機制處理的。而Error表示Java執行環境出現的錯誤,例如:JVM記憶體溢位等。
總結說明
異常是程式出問題的本能反應,使用try catch表示你能很好處理相應程式碼區塊的異常情況,從而避免程式異常中斷,反之,你就throws Exception,把異常向上一級拋出。
问:我理解的try catch 是处理异常。难道java有些方法对象 本身就要配合try catch来使用的吗?
答:再普及一點基本知識:
異常的分類
可檢測異常:可檢測異常經編譯器驗證,對於聲明拋出異常的任何方法,編譯器將強制執行處理或聲明規則,不捕捉這個異常,編譯器就通不過,不允許編譯。
非檢測異常:非檢測異常不遵循處理或聲明規則。在產生此類異常時,不一定要採取任何適當操作,編譯器不會檢查是否已經解決了這樣一個異常。
總結說明
關於這點問題,建議透過查看相關原始碼來分析理解,總的原則就是,只要你調用的方法中帶有可檢測異常,你就需要處理,try catch是一種方式,或者就throws Exception,把異常向上一級拋出。以下舉例說明如下:
(用到try catch的場景)
PrintWriter pw = null;
try {
pw = new PrintWriter(new File(CodeUtil.invoPath, name));
pw.write(str_invo.toString());
} catch (FileNotFoundException e) {
throw new RuntimeException(name+"文件未找到!");
}
(查看相關原始碼分析)
public PrintWriter(File file) throws FileNotFoundException {
this(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file))),
false);
}
(分析總結)
因為構造方法PrintWriter(File file)後面跟了throws FileNotFoundException,所以你呼叫該構造方法時就必須對它拋出的異常進行處理。