java編譯聲明為什麼還要拋出
A. 已經捕獲了異常 為什麼編譯時還提示「必須對其進行捕捉或聲明以便拋出」
你聲明的函數中聲明了此函數拋出異常(public Connection getConn() throws SQLException),但是實際上函數體中在try-catch中已經將這個異常捕獲(catch(SQLException ex){
System.out.println(ex.getMessage())),捕獲後此函數就不能再拋出異常了,所以會提示未報告的異常的錯誤。只需將函數名後面的throws SQLException去掉即可。
B. java程序中的異常應該在什麼時候拋出
談談個人理解:
大多數程序員問什麼時候拋出,其實都是在糾結方法什麼時候throws Exception,如果是這樣,那麼說明你根本還沒搞懂什麼是聲明什麼是拋出。簡單的說:throws是聲明,throw是拋出。
throws 一般是檢查型異常,如IOExcetion等,簡單點說,編譯的時候就有需要聲明或捕獲的異常,表示此方法不處理異常,而交給方法調用處進行處理
throw 一般是拋出運行時異常(即該異常為RuntimeException的子類)。並且方法一般不需要throws Exception
API
所以我之理解:沒事別瞎到方法後面加throws Exception,看著亂,因為大多都是RuntimeException;除非你真的有檢查時異常你再聲明給上一層處理。
主要一些自己的看法,歡迎更正,謝謝大家了
C. JAVA方法聲明處的throws關鍵字,是說明這個方法可能有異常拋出吧可能。那為什麼有些方法一定要throws呢
我不清楚是否正確理解了樓主想了解的問題,但我盡可能簡略而全面的談一談Java語言的異常處理。
首先,Java中在一個方法內通常有兩種形式的異常處理方法。
1. 在當前方法內使用try..catch..finally的語法結構捕獲並處理異常
2. 在方法體前,接著方法定義後通過throws關鍵字,申明拋出異常
Q 為什麼有這兩種形式呢,或者說為什麼需要處理異常?
A 即使使用的是Java或者C#等其他「高級語言」,異常的處理也在所難免。舉幾個例子,我們需要讀取一個文本文件,正常情況下,的確不會有任何問題。但如果發生意外,比如我們想要讀取的那個文件並不存在,或者還沒有生成,又或者被改名了,刪除了,怎麼辦呢?這些問題就編程語言本身而言(即使使用File.exists()或者isDir&isFile等判斷,也是人力所為),他們是並不知道的。當程序運行到某一行,試圖去讀取一個並不存在文件的時候,異常便發生了(注意,這里說的異常通常是指Exception的普通子類,而非運行時錯誤或者Error),而在我們這個例子里,就會引發FileNotFoundException,又比如,如果要操作一個網路位置上的遠程文件,則還有可能引發IO異常、或者網路異常等;在比如試圖訪問一個數組中並不存在的數據時,則會引發ArrayIndexOutOfBounds的越界異常。每當這些時候,Java的編譯器和語義規則就會強制要求我們捕獲並且處理它們。簡單的說,程序就像小孩子,如果不這樣做的話,他就不知道該怎樣運行下去了(這里我用的只是一個比喻,事實上世界還存在解釋型的腳本編程語言和函數式語言等,通常他們的編譯器並不一定強制要求你處理所有的異常,而是在運行時碰到具體錯誤才告訴你)。當時,需要注意的是,養成良好的異常處理習慣,仍是一個優秀程序員的習慣。
Q 什麼時候我需要在當前方法里catch然後處理,什麼時候我需要throw出去?
A 舉個例子,有時候,某個可能異常可能並不重要,我不想對他進行catch之後的大段處理、或者基於遠程的網路操作,我們只能記錄日誌,我可能就會想通過自定義一個自己的Exception子類,通過在內部方法內直拋出相關異常,最後在某個具體的handler或業務邏輯層(package)在統一捕獲和記錄處理。總之,何時處理、何時拋出屬於項目架構和基於工程角度需要思考的問題。總而言之,具體問題,具體分析。
D. java 編譯 "方法聲明無效;需要返回類型"怎麼解決
方法返回類型未定義,如果不想返回 就 使用 void ;
修改如下:
public void My_ProcerConsumer(String s){
name=s;
}
或
public String My_ProcerConsumer(String s){
String name=「」;
name=s;
return name;
}
E. java什麼異常在不需要聲明就會拋出
檢查性異常會在編譯的同時提示出來,有的異常編譯的時候沒有錯,但是在運行的時候會出現異常,比如數組越界,計算時候除數為0.所以你說的應該是 運行時異常
F. JAVA 寫的代碼里編譯後報錯,說未報告的異常錯誤需要對其捕獲或申明以拋出
你的代碼沒有異常處理,加上異常處理。
G. java中的編譯異常聲明後為什麼還要主動拋出
為了讓外部程序抓住並處理,如果不拋出,則外部程序得不到也不知道調用程序產生了錯誤
H. java在編譯時報錯: 未報告的異常錯誤IOException; 必須對其進行捕獲或聲明以便拋出
IO異常必須捕獲或者拋給JVM處理,否則編譯的時候就會報錯。
I. java一個疑問,為什麼有些異常throw出去需要在函數頭用throws聲明,一些就不用。
所謂checked exception和runtime exception
checked exception告知外部用戶此方法在某些情況下可能拋出這個錯誤,你應該捕獲並處理錯誤以便程序在可能的情況下能夠繼續運行下去(當然你也可以通過throws聲明將異常再往上層暴露,但終究有一層是要去catch這個異常的)。這些錯誤往往是可預期而且可以作為異常流來處理的。checked exception作為語法上的一種強制措施讓你在代碼編譯階段就必須對異常進行處理。
比如IOException,當你打開、讀取、寫入文件時可能拋出這個錯。你可以捕獲並提示最終用戶『文件操作失敗,請重試』等信息,而不是任由它拋到JVM中導致當前線程掛掉。
而runtime exception可能產生於運行時的一些不可預知的時刻,而且往往產生後沒有有效的手段處理,因此不需要強制對其進行聲明和捕獲。
你可以認為checked exception就是要強制你去處理這個異常(不管你throws多少層,你終歸要在某個地方catch它);而runtime exception則沒有這個限制,你可以自由選擇是否catch。
=== 分割線 ===
事實上我覺得checked exception是一個非常2B的設計,很多語言中都沒有這種設計。API設計並不需要這種強制處理的錯誤,可以通過封裝返回值來做到更友好的處理。
單說Java的變種Groovy(確切來說不能叫變種,不過語法也相似)就沒有這么蛋疼的設計;Scala也同樣沒有。
J. java編譯器和解釋器自身是否可以捕獲異常,為什麼還要使用try...catch...捕獲異常
應該是JAVA虛擬機,
JAVA虛擬機可以捕捉異常,但是他不會處理異常,他的處理方法就是中止發生異常的線程,列印異常信息。
而你自己catch異常,可以嘗試修復異常,而不中斷程序。
另外throws是用來聲明這個方法要拋出一個異常,必須跟在方法聲明後面,
如public void foo() throws Exception {
//...
}
而throw是你要實際拋出一個異常時用的,如
如public int divide(int a, int b) throws Exception {
if(b == 0) {
throw new Exception("can't divide 0");
}
return a / b;
}