編譯錯誤可以拋出異常么
就是你用javac命令將源代碼(.java)文件翻譯成位元組碼(.class)文件時產生的錯誤。
比如,變數名不符合規定,變數沒定義,關鍵字拼寫錯誤等等。。。
java的編譯器(javac)會根據java語法規定做一些檢查,不符合規定的就不通過編譯。
編譯錯誤,是相對於運行時錯誤而言的。
運行時錯誤,是你用java命令運行時會出現的錯誤,一般會拋出異常。
② 編譯錯誤和運行時異常怎麼區分
編譯錯誤 一般都是語法錯誤
運行時錯誤一般都是比如數組索引指向空值 4/0 這類錯誤
請參考
③ java什麼時候是編譯出錯,什麼時候會報異常呢
編譯錯時因為你寫的語法不正確,報異常有時候是程序自身的錯誤 大部分是你程序邏輯有錯誤
④ 編譯時異常和運行時異常怎麼理解,怎麼區分兩者
編譯錯誤,一般是語法上存在問題,編譯過不去; 運行錯誤,是指程序在運行過程中出現錯誤,只能說是程序存在一定的邊界bug; 編譯錯誤一般是指java語法的錯誤,運行錯誤分兩種一種是error還有就是Exception 有的異常是拋出但可繼續執行之後的代碼
⑤ 程序中凡是可能出現異常的地方必須進行捕獲或拋出對嗎
一、異常的種類
java異常可以分成兩大類:Exception和RuntimeException(雖然RuntimeException是從Exception繼承的)。exception異常代表「無法避免的異常」 如io異常 往往這類異常是由於外部原因造成的,程序本身無法保證他們不發生,所以這類異常必須捕獲。如果在函數內部無法處理這個異常必須再次拋出(在函數後面用throws語句),如果什麼都不做就出現編譯錯誤。
runtimexception是指「可以避免的異常」,如 null引用異常,這類異常都是由程序內部原因造成的,是可以避免的。對於這類異常可以忽略他們,但一旦發生程序就會異常終止。這類異常對debug非常有幫助,當然,如果需要也可以catch。
另外,有些地方即使不會有exception,但是從商業邏輯上是錯誤的、非預期的,也可以拋出user exception。例如,用戶輸入非法,bank account非法透支等等。
二、主要原則
處理意外的一個重要原則,就是要麼處理,要麼接著拋,決不能吃掉(You either handle it, or throw it. You don』t eat it.)這就是說,當你捕獲一個異常之後,必須決定是否立即處理這個異常,或者繼續拋出這個異常(或者另一個自定義異常),以便由調用的客戶端捕獲之。當客戶端捕獲到以後,又會繼續進行類似的判斷。
一般來說,GUI端是要處理異常的,比如JSP捕獲到異常之後,需要先是給用戶一個友好的出錯信息,而不要給出系統的出錯信息。系統的出錯信息一方面不太友好,另一方面提供了太多的系統信息,容易被惡意用戶用來攻擊系統。
換句話說,所有的異常最終必須有一個終極的處理者,這就是GUI。至於中間的環節,比如在伺服器端運行的JavaBean是否要處理捕獲到的異常,還是繼續拋出所捕獲的異常,需要視具體情況處理。
除非你想把異常處理的責任交給調用者,一般不用throws。比如你要讀入一些文件,如果你想通知調用者,讓調用者決定如何處理這個異常,你就把這個異常throws給調用者;如果你知道應該如何處理這個異常,或者你想把異常馬上解決,你可以就地catch她。
這完全取決於你想把異常自己立即處理還是想把處理責任返回給調用者。取決於你的程序的結構和要求。
需要注意的有:
1、如果無法處理某個異常,那就不要捕獲它。
2、如果捕獲了一個異常,請不要胡亂處理它。
3、盡量在靠近異常被拋出的地方捕獲異常。
4、在捕獲異常的地方將它記錄到日誌中,除非您打算將它重新拋出。
5、按照您的異常處理必須多精細來構造您的方法。
6、需要用幾種類型的異常就用幾種,尤其是對於應用程序異常。
三、異常嵌套和捕獲適當的異常
按照Java語言的定義,所謂異常(Exception)指的就是向調用方法(calling method)表示發生非正常情況的習慣方式。下面討論兩種在處理異常時可茲利用的技術:異常嵌套和捕獲適當的異常。
異常嵌套
你在試圖捕獲異常並打算扔出異常時該採取什麼措施呢?同時,你希望原始的異常信息可用嗎?
要回答以上的問題你不妨嘗試一下NestedException類。具體的編程並不難,唯一要做的無非是利用構造器並且重載printStackTrace()以便顯示出正確的數據。
此外,你還應當考慮封裝Throwable而非Exception類來創建更具有重用性的組件。之後,你可以創建NestedRuntimeException變數封裝Throwable但無需對其進行聲明。
捕獲適當的異常
正確地處理異常並不是一項輕松的任務,這是因為異常的處理有時會導致程序出現其他不明行為。不過,以下三條規則可以幫助你避免錯誤處理異常所可能遭遇的風險。
規則 #1: 總是捕獲扔出異常的類型而不要理睬異常的超類。為了遵守通常的代碼習慣,你可以採用Exception類的大寫字母作為變數名,如下所示:
catch(FileNotFoundException fnfe)
以及
catch(sqlException sqle)
規則 # 2: 決不讓catch塊留空。在很多情況下雖然確實編寫了try/catch塊但在代碼的catch部分卻什麼都沒有做。或者,如果採用了日誌API(Logging API),那麼請編寫代碼把異常寫到日誌中。
規則 # 3: 決不扔出Exception基類的實例。開發人員應當總是扔出自己創建的異常類。
扔出異常的API很難處理。在聲明方法扔出java.lang.Exception的情況下,所有的問題都會強加在API用戶的頭上,這樣他們就無法以一種專業的編程方式來處理異常。通過為扔出API聲明Exception類的子類這一舉措,API開發人員就可以減輕用戶的負擔。
以上提到的兩種技術在處理異常時還可能用得更好、更適當。嵌套技術令異常扔到另一異常的內部,而捕獲適當的異常令程序調試大大簡化。
⑥ Java異常處理中關鍵字throws,throw,try,catch,finally分別代表什麼意義在try塊中可以拋出異常嗎
throws是用來聲明一個方法可能拋出的所有異常信息
throw則是指拋出的一個具體的異常類型。
通常在一個方法(類)的聲明處通過throws聲明方法(類)可能拋出的異常信息,而在方法(類)內部通過throw聲明一個具體的異常信息。
throws通常不用顯示的捕獲異常,可由系統自動將所有捕獲的異常信息拋給上級方法;
throw則需要用戶自己捕獲相關的異常,而後在對其進行相關包裝,最後再將包裝後的異常信息拋出。
對異常處理方式不同.throws對異常不處理,誰調用誰處理,throws的Exception的取值范圍要大於方法內部異常的最大范圍,而cathch的范圍又要大於throws的Exception的范圍;throw 主動拋出自定義異常類對象. throws拋出的是類,throw拋出的是對象.
在方法定義中表示的是陳述語氣,第三人稱單數,throw 顯然要加s。(throws 一般用作方法定義的子句)
在函數體中要用throw,實際上是祈使句+強調,等價於DO throw ....,do +動詞原形
throw 用於引發異常,可引發預定義異常和自定義異常。
I)異常中「throws」和「throw」的區別:
throw 是個「動詞」,緊接在try語句塊之後。
而throws 是「名詞」 ,用在函數方法名後 function A () throws Exception e {}
throw用在程序中明確表示這里拋出一個異常。throws用在方法聲明的地方,表示這個方法可能會拋出某異常。
throw用來拋出實際的異常, 後面要跟一個異常對象(實例), 是一個實際的語句
throws是用來聲明的, 加在方法聲明的後面, 後面跟一個異常類的名字, 表示一般性動作而不是特指某一個動作.
使用throws是來說明,當前的函數會拋出一個異常。
在一般的情況下,你調用的一些函數會拋出一些異常。但是你又不想在當前的context中去處理它,就可以聲明該函數會拋出該異常,這樣你就不用去try-catch它了。當出現該異常,該函數會拋出此異常,讓上一層的函數去處理。throws也稱異常規范
public static h() throws
{
try
{
a.g();
}
catch(Exception e)
{
throw e;
}
}
因為你沒有對這個異常處理,而是簡單的拋出了。
而單純的聲明
public static h() throws
{
a.g();
}
也會拋出這個異常
II)try catch \throws \throw
throws如果發生了對應的錯誤後,下邊的的確不會被執行;
try catch的理解應該辯證點看:如果catch後沒有再次throw出去,那會繼續執行;要想不執行必須throw處理
throws 拋出異常,解決不了再向上,直道碰到能解決這個異常的處理程序,就好像你的上司讓你執行一項任務,中途你遇到問題不知道如何解決,你把問題返還給你的上司,認為既然是T分配的任務就該知道如何解決這個問題,你的上司無法解決同樣把它送給經理解決,依次向上,直到有人能解決這個問題為止(不想自己另外寫代碼處理異常時非常有用)
try catch 則是考慮到try包含這段代碼可能會遇到這種異常,直接用catch捕獲處理,catch包含的代碼為處理代碼
throws 只是把一個異常拋出去了,如果你的上層代碼有處理方式,就由上層代碼來處理這個異常。
而try/catch對是清楚的知道該操作可能出現什麼異常,同時在catch塊中應該有處理的方法。
而且還有一種方式就是try/catch/finaly的方式。
Throws是把異常返回給調用者,由調用者處理,調用者還是要try/catch,跑不掉的
catch中就一個簡單的SYSTEM.OUT.PRINTLN(…………);還有,連接資料庫時會連接不上,你也不知道是驅動問題、電腦問題還是網路問題,發給用戶,用戶也看不懂,所以統統throws給catch,提示請與管理員聯系。。。。。。這就簡單多了
throws 寫在方法簽名後,
throw 寫在方法體內,可以寫在if()....
也可以catch住一個exception後立刻又把他throw 出去,什麼處理也不做,還可以catch住後throw new 一個你自己定義的exception ....
throws 就是把異常拋出,但是在以後要不有個catch接受,要不就拋給主函數.就是逐級往上一級拋,直到有一個接受他的
Throws拋出異常交給調用該方法的方法 處理,即:
public class Test{
public static void main(String[] args){
Test2 test2 = new Test2();
try{
System.out.println("invoke the method begin!");
test2.method();
System.out.println("invoke the method end!");
}catch(Exception e){
System.out.println("catch Exception!");
}
}
}
class Test2{
public void method() throws Exception{
System.out.println("method begin!");
int a = 10;
int b = 0;
int c = a/b;
System.out.println("method end!");
}
}
很明顯,答案出來了:
invoke the method begin!
method begin!
catch Exception!
finally語句是任選的,try語句後至少要有一個catch或一個finally,finally語句為異常處理提供一個統一的出口,不論try代碼塊是否發生了異常事件,finally塊中的語句都會被執行
在覆蓋的方法中聲明異常
在子類中,如果要覆蓋父類的一個方法,或父類中的方法聲明了throws異常,則子類的方法也可以拋出異常,但切記子類方法拋出的異常只能是父類方法拋出的異常的同類或子類。
如:
import java.io.*;
class A {
public void methodA()throws IOException{
.....
}
}
class B1 extends A {
public void methodA()throws FileNotFoundException{
....}
}
class B2 extends A {
public void methodA()throws Exception{//Error
....}
}
public void method() throws Exception {
try {
具體程序
} catch(Exception ex) {
}
}
如果具體程序出錯的話,將處理下面程序體中catch的地方,這個時候throws Exception 其實是沒有意義的。
public void method() throws Exception {
try {
具體程序
} catch(FileNotFoundException ex) {
}
}
如果具體程序出錯的話,且是FileNotFoundException 的情況下,將處理下面程序體中catch的地方處理。
這個時候FileNotFoundException 以外的Exception 將通過 throws Exception ,throw到上一層。
throw寫在方法體內, throws寫在方法名的後面
throw關鍵字的格式:throw new ArithmeticException(); 拋出一個異常,這些異常可以使unchecked exception(也就是RuntimeException),也可以是checked execption. throw必須有一個捕獲該異常的try/catch語句
throws關鍵字的格式
private void arrayMethod(int[] arr)
throws ,
ArithmeticException {
// Body
}
throws子句列出了方法可能拋出的異常類型,除了Error和RuntimeException異常,方法中可能拋出的異常必須在throws列表中聲明,否則就會出現編譯錯誤。
例如:假如方法中可能拋出IllegalAccessException(屬於checked execption)則必須在throws列表中聲明。
系統異常是默認拋出的,自己定義的異常要顯示拋出
還有一些是庫方法只throw 沒有處理的,所以表面上你看到沒有throw也catch到異常
⑦ java中的編譯異常聲明後為什麼還要主動拋出
為了讓外部程序抓住並處理,如果不拋出,則外部程序得不到也不知道調用程序產生了錯誤
⑧ java中throw拋出的一些異常,程序不進行處理程序編譯也不會錯誤
不會,拋出異常本意就是在某些不滿足條件的時候終止程序運行,但是也可以選擇捕獲處理,捕獲後就不會使程序終止。但是為什麼有的系統方法必須讓你捕獲呢?那是因為該方法使用throws關鍵字聲明了,作用就是將throw拋出的異常顯示的交給調用者處理,如果調用者不處理,就不try-catch那麼才會編譯不通過。
⑨ 關於拋出異常的問題
根據我的理解! 第一個程序里是直接throw拋出異常,在編譯的時候java已經發現你程序拋出異常,而try{}catch是程序運行時去捕獲,故不會通過編譯,第二種情況也就不難理解了,因為你有if判斷,java編譯時是不運行裡面的代碼的,就好比你一個方法要return 你如果在if判斷裡面return還是會報編譯錯誤的, 希望能幫到你!
