//拋出例外
class Demo175
{
static int change(String str) throws NumberFormatException
{
return Integer.parseInt(str);
}
public static void main(String[] args)
{
String str1="1200";
String str2="abcd";
try
{
System.out.println("str1/100="+change(str1)/10);
}
catch(NumberFormatException e)
{
System.out.println("這個字串不能被轉換成int型別的數!");
}
try
{
System.out.println("str2/100="+change(str2)/10);
}
catch(NumberFormatException e)
{
System.out.println("這個字串不能被轉換成int型別的數!");
}
}
}
我把 static int change(String str) throws NumberFormatException
{
return Integer.parseInt(str);
}
改成 static int change(String str)
{
return Integer.parseInt(str);
}
這樣我懂,因為還是會被try捕捉到
可是有了 throws NumberFormatException
我就不懂所謂的拋出的意思
因為還是被捕捉到了
拋出的意思是什麼??
請高手解釋一下!!
謝謝!!
2006-12-08 09:53:07 · 2 個解答 · 發問者 ANDY 2 in 電腦與網際網路 ➔ 程式設計
你的意思是說 2種的結果大致上是一樣 只是過程不一樣
一種是JVM就會往下一層找,下一層的意思就是,是誰呼叫了change( )的?那就誰要付這個責任。
另一種是的意思是告訴JVM,這裡有可能會出現NumberFormatException的錯誤。
但在change( )裡面,並沒有實作try{ }catch{ }呀。所以會往main( )裡找try{ }catch{}。
我覺得你說的關鍵點就在 一個是往誰呼叫他去找
另一個是去main裡面找try{ }catch{}
是不是這樣的意思呢??
我有沒有想錯!!!?
2006-12-08 17:25:32 · update #1
請問"'方法中的例外"也就是
static int change(String str)
{
return Integer.parseInt(str);
}
跟"拋出例外"
static int change(String str) throws NumberFormatException
{
return Integer.parseInt(str);
}
2006-12-09 09:10:14 · update #2
這2種有什麼不同??
我會這樣問是因為我一開始認為這2種根本是同樣的東西
書上說:
方法中的例外:
在try所括起來的程式中有時會去呼叫方法,雖然方法可能不是定義在try所要捕捉例外的程式區段中,但是再執行方法時所發生的例外一樣會被try捕捉到。
拋出例外:
有時對於一個發生在方法中的例外,可以暫時不去處理,而是將其拋出,拋到呼叫這個方法的地方來處裡。
字面上的意思,兩者都是說誰呼叫這個方法就誰處裡。
2006-12-09 09:10:19 · update #3
定義了一個有例外拋出的方法,再該方法中的一條敘述可能會有例外發生,所以使用throws將可能出現的例外拋出,再呼叫方法的地方System.out.println("str1/100=" change(str1)/10);
System.out.println("str2/100=" change(str2)/10);
將被try捕捉到。由於在本程式中字串str2無法被轉換為int數值,將會有NumberFormatException 例外發生。
2006-12-09 09:19:01 · update #4
你是說我懂了?
難道是說 : 方法中的例外是 try 一樣會去捕捉呼叫的方法所發生的例外。
而拋出例外是再呼叫方法中所發生的例外先不去處哩,而是回到呼叫此方法的地方去找尋try-catch看看有沒有符合的例外發生。
而在這個範例中,不管是哪個方法,最後都是因為字串不能轉換所發生的例外事件。
是這樣的意思嘛?
2006-12-10 08:56:24 · update #5
Java在執行method的時後,會利用method stack。
就是說,一開始程式的進入點是main( ),然後再呼叫change( )。
當在change( )出錯的時後,JVM會找有沒有程式碼捕捉這個異常,
java捕捉異常的方法,會用try{}catch{}子句去抓異常。
所以,在change( )沒有看到try{ }catch{ }子句。沒有找到,那怎麼辦呢?JVM就會往下一層找,下一層的意思就是,是誰呼叫了change( )的?那就誰要付這個責任。
因此,是main( )呼叫它的。好在main( )裡面有實作try{}catch{}子句。JVM就會在catch裡面找到適合的Excption。
至於,為什麼要在change( ) 上 throws NumberFormatException呢?
它的意思是告訴JVM,這裡有可能會出現NumberFormatException的錯誤。
但在change( )裡面,並沒有實作try{ }catch{ }呀。所以會往main( )裡找try{ }catch{}。
至於你說為什麼還是捕捉到,因為change( ) throw了Exception。
這就像只是宣告而已,沒有實作!!所以,真的發生異常的時後,
也是沒辦法處理。
嗯,希望我有解釋清楚。
2006-12-09 10:02:42 補充:
瞭解異常處理,就要先瞭解一下method stack。
因為在change( ) throws NumberFormatException,但沒有實作try catch。所以JVM就會去找當初誰呼叫change( )的method。就是main( )。
假設啦: main( ) -> ch1( ) -> ch2( ) -> change( )
jvm在change( )找不到catch,就會去找ch2( ),又找不到,則找ch1( ),最後一層則是main( )。main( )是程式一開始的起始點,最後找也只找到這裡就會結束。
2006-12-10 13:06:48 補充:
看來你懂了^^
2006-12-11 16:19:20 補充:
嗯,因為不管有沒有在方法宣告例外
但在數字轉換的時後,結果是錯誤的
剛好在catch有對應到的Exception可以
處理這個例外
2006-12-08 17:15:56 · answer #1 · answered by ? 2 · 0⤊ 0⤋
//吉他手 例外說明
在java裡例外有兩分兩大種:
1.不可檢查的例外(執行時期的例外)。
例如:NumberFormatException、ArrayIndexOutOfBoundsException、ArithmeticException等等…,只要是屬於RuntimeException類別之下的例外都是執行時期的例外。
2.可檢查的例外(編譯時期可檢查出的例外)。
例如:IOException等等…
處理第一種例外的方式有:
1.不管例外,或在method後面加上throws 例外名稱 或 其父類別 ,但此方式只是把例外丟給外層的method,直到例外有被處理程式才會往下執行,如果例外被丟到main()時又沒處理,就結束程式,並列出例外的歷程。
例如:int change(String str) throws NumberFormatException{}
上面的方式程式依然可以通過編譯,並執行程式,但未對例外進行處理。
2.以try-catch包住會丟出例外的程式碼。
例如:
int change(String str)
{
try
{
return Integer.parseInt(str);
}catch(NumberFormatException e)
{
//顯示例外的歷程或其他自定錯誤訊息
}
}
以第2種try-catch方式處理例外,程式將會繼續往下執行,直到結束。
補充說明:
在java裡「拋出例外」是很獨特的一種方式,此種做法可以確保程式的安定性,並且讓程式設計人員可以明確的知道程式在哪一行出來什麼樣的問題,因為例外都有名稱,開發人員只要一看就知道程式為什麼錯誤了。
而為什麼當例外產生時,會用「拋出」這個字眼,我個人認為有一個原因是因為throw這個關鍵字的翻譯關係之外,還因為當一個例外被產生時,例外會被try-catch所補捉,然後一一的比對catch裡的例外名稱是否符合,這個形式很像從高樓拋出一個球,然後下面就一樓一樓的去判斷是不是屬於自己的球,如果是就補捉球,不是自己的球就讓球往下一層樓掉,直到掉到地上。
2006-12-09 03:38:15 補充:
「處理第一種例外的方式有:」
更正為
「處理例外的方式有:」」
2006-12-08 22:36:24 · answer #2 · answered by 吉他 5 · 0⤊ 0⤋