1. 程式人生 > >java的異常和java web容器的異常

java的異常和java web容器的異常

new t 設計 tar 後繼 mvc spec tex nts finished

一.java的異常,只要catch住異常了,程序就不會掛,依然會執行catch之後的語句

Java程序發生異常就掛了嗎?

為了驗證程序不會掛,我寫了個例子給大家看看。

測試代碼:

import java.io.File;
import java.io.IOException;

/**
* Java程序發生異常就掛了嗎?
*
*/
publicclass TestException {
publicstaticvoid main(String[] args) {
TestException te = new TestException();

String s = te.test();
System.out.println(s);
}

/**
* 這個方法有異常,看看異常發生時候會不會執行到底,會不會返回個值?
*
* @return 一個字符串!
*/
public String test() {
System.out.println(">>>> start");
try {

test1();
File f = null;
f.delete();
// int x = 10;
// int y = 0;
// int z = x / y;
System.out.println("計算完成了!");

} catch (Exception e) {

System.out.println("出異常掛了我如何處理呢?");
System.out.println(e);
} finally {
System.out.println("最後總要做的一件事。。。");
}
System.out.println(">>>> end");
return"good!";
}

/**
* 拋個比較猛烈的異常看看程序會掛嗎?
*
* @throws IOException
*/
publicvoid test1() throws IOException {
thrownew IOException();
}
}


運行結果:

>>>> start
出異常掛了我如何處理呢?
java.io.IOException
最後總要做的一件事。。。
>>>> end
good!

Process finished with exit code 0

換個異常運行看看:

>>>> start
出異常掛了我如何處理呢?
java.lang.NullPointerException
最後總要做的一件事。。。
>>>> end
good!

Process finished with exit code 0

再換個控制針看看:

>>>> start
出異常掛了我如何處理呢?
java.lang.ArithmeticException: / by zero
最後總要做的一件事。。。
>>>> end
good!

Process finished with exit code 0

結果表明:程序僅僅跳過了try中發生異常以後的代碼,在發生異常時候執行了處理語句塊catch,在catch執行結束後接著執行了finally語句塊,然後繼續執行try...catch...finally之外的語句塊。
---------------------
作者:zcywell
來源:CSDN
原文:https://blog.csdn.net/zcywell/article/details/7452952
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

二.spring web的異常

無論程序怎麽拋,在mvc controller中哪怕沒有catch異常,你會發現web程序依然沒有掛掉,那必然是有個地方做了catch住,否則程序會掛掉的。這就是spring mvc必然做了統一的異常攔截。

Java中的異常什麽候由JVM處理

大哥異常能處理就處理 ,能處理 就 轉換成RuntimeExcepiton異常 供上層處理也可以讓jvm處理。

簡單來說,當N層方法調用中,歸根到底,最終都是由主類的主方法(即Main方法)去調用的,亦稱之為入口方法,當產生的異常所有方法中都未處理,最終會交給JVM處理,處理結果就是終止程序運行,並拋出異常信息。
一般設計中,如果想該代碼產生異常而方便查錯,會保留該異常處理,或向上一層拋出該異常,其他情況都會Try Catch去處理。

實例

下面的例子中聲明有兩個元素的一個數組,當代碼試圖訪問數組的第三個元素的時候就會拋出一個異常。

ExcepTest.java 文件代碼:

// 文件名 : ExcepTest.java import java.io.*; public class ExcepTest{ public static void main(String args[]){ try{ int a[] = new int[2]; System.out.println("Access element three :" + a[3]); }catch(ArrayIndexOutOfBoundsException e){ System.out.println("Exception thrown :" + e); } System.out.println("Out of the block"); } }

以上代碼編譯運行輸出結果如下:

Exception thrown  :java.lang.ArrayIndexOutOfBoundsException: 3
Out of the block

多重捕獲塊

一個 try 代碼塊後面跟隨多個 catch 代碼塊的情況就叫多重捕獲。

多重捕獲塊的語法如下所示:

try{ // 程序代碼 }catch(異常類型1 異常的變量名1){ // 程序代碼 }catch(異常類型2 異常的變量名2){ // 程序代碼 }catch(異常類型2 異常的變量名2){ // 程序代碼 }

上面的代碼段包含了 3 個 catch塊。

可以在 try 語句後面添加任意數量的 catch 塊。

如果保護代碼中發生異常,異常被拋給第一個 catch 塊。

如果拋出異常的數據類型與 ExceptionType1 匹配,它在這裏就會被捕獲。

如果不匹配,它會被傳遞給第二個 catch 塊。

如此,直到異常被捕獲或者通過所有的 catch 塊。

實例

該實例展示了怎麽使用多重 try/catch。

try { file = new FileInputStream(fileName); x = (byte) file.read(); }catch(IOException i) { i.printStackTrace(); return -1; }catch(FileNotFoundException f) //Not valid! { f.printStackTrace(); return -1; }

throws/throw 關鍵字:

如果一個方法沒有捕獲到一個檢查性異常,那麽該方法必須使用 throws 關鍵字來聲明。throws 關鍵字放在方法簽名的尾部。

也可以使用 throw 關鍵字拋出一個異常,無論它是新實例化的還是剛捕獲到的。

下面方法的聲明拋出一個 RemoteException 異常:

import java.io.*; public class className { public void deposit(double amount) throws RemoteException { // Method implementation throw new RemoteException(); } //Remainder of class definition }

一個方法可以聲明拋出多個異常,多個異常之間用逗號隔開。

例如,下面的方法聲明拋出 RemoteException 和 InsufficientFundsException:

import java.io.*; public class className { public void withdraw(double amount) throws RemoteException, InsufficientFundsException { // Method implementation } //Remainder of class definition }

finally關鍵字

finally 關鍵字用來創建在 try 代碼塊後面執行的代碼塊。

無論是否發生異常,finally 代碼塊中的代碼總會被執行。

在 finally 代碼塊中,可以運行清理類型等收尾善後性質的語句。

finally 代碼塊出現在 catch 代碼塊最後,語法如下:

try{ // 程序代碼 }catch(異常類型1 異常的變量名1){ // 程序代碼 }catch(異常類型2 異常的變量名2){ // 程序代碼 }finally{ // 程序代碼 }

聲明自定義異常

在 Java 中你可以自定義異常。編寫自己的異常類時需要記住下面的幾點。

  • 所有異常都必須是 Throwable 的子類。
  • 如果希望寫一個檢查性異常類,則需要繼承 Exception 類。
  • 如果你想寫一個運行時異常類,那麽需要繼承 RuntimeException 類。

可以像下面這樣定義自己的異常類:

class MyException extends Exception{ }

只繼承Exception 類來創建的異常類是檢查性異常類。

下面的 InsufficientFundsException 類是用戶定義的異常類,它繼承自 Exception。

一個異常類和其它任何類一樣,包含有變量和方法。

實例

以下實例是一個銀行賬戶的模擬,通過銀行卡的號碼完成識別,可以進行存錢和取錢的操作。

InsufficientFundsException.java 文件代碼:

// 文件名InsufficientFundsException.java import java.io.*; //自定義異常類,繼承Exception類 public class InsufficientFundsException extends Exception { //此處的amount用來儲存當出現異常(取出錢多於余額時)所缺乏的錢 private double amount; public InsufficientFundsException(double amount) { this.amount = amount; } public double getAmount() { return amount; } }

為了展示如何使用我們自定義的異常類,

在下面的 CheckingAccount 類中包含一個 withdraw() 方法拋出一個 InsufficientFundsException 異常。

CheckingAccount.java 文件代碼:

// 文件名稱 CheckingAccount.java import java.io.*; //此類模擬銀行賬戶 public class CheckingAccount { //balance為余額,number為卡號 private double balance; private int number; public CheckingAccount(int number) { this.number = number; } //方法:存錢 public void deposit(double amount) { balance += amount; } //方法:取錢 public void withdraw(double amount) throws InsufficientFundsException { if(amount <= balance) { balance -= amount; } else { double needs = amount - balance; throw new InsufficientFundsException(needs); } } //方法:返回余額 public double getBalance() { return balance; } //方法:返回卡號 public int getNumber() { return number; } }

下面的 BankDemo 程序示範了如何調用 CheckingAccount 類的 deposit() 和 withdraw() 方法。

BankDemo.java 文件代碼:

//文件名稱 BankDemo.java public class BankDemo { public static void main(String [] args) { CheckingAccount c = new CheckingAccount(101); System.out.println("Depositing $500..."); c.deposit(500.00); try { System.out.println("\nWithdrawing $100..."); c.withdraw(100.00); System.out.println("\nWithdrawing $600..."); c.withdraw(600.00); }catch(InsufficientFundsException e) { System.out.println("Sorry, but you are short $" + e.getAmount()); e.printStackTrace(); } } }

編譯上面三個文件,並運行程序 BankDemo,得到結果如下所示:

Depositing $500...

Withdrawing $100...

Withdrawing $600...
Sorry, but you are short $200.0
InsufficientFundsException
        at CheckingAccount.withdraw(CheckingAccount.java:25)
        at BankDemo.main(BankDemo.java:13)

java的異常和java web容器的異常