一.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)