程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java中的異常處理

Java中的異常處理

編輯:關於JAVA

異常處理是初學者經常忽視執行的編程技巧。然而,當他們完成了一項大型項目後,就會發現僅僅停留在表面的工作是不夠的。在本文中,我們將對異常處理進行討論,並為大家解釋其重要性,尤其是要告訴大家怎樣處理這些情況。

首先,讓我們解釋一下什麼是異常情況,通常也稱例外。正如在其他的編程語言中那樣,它也適用於Java:異常情況是那些在運行時出現錯誤的情況。這些錯誤並非真正的錯誤,因為他們是一些例外。我們可以將這些情況理解為必須解決的異常事件,否則程序將無法繼續執行。所以我們就有必要了解怎樣處理異常事件。

在異常事件的例子中最顯著的應該是在程序執行時,運行時的分配變成了零。這樣程序就無法執行,於是Java就會拋出一個異常事件,確切點說是ArithmeticException。從Java程序員的角度來看,異常事件是對象。拋出異常事件類似於拋出對象。但是,並非所有的對象都可以被拋出。

為了充分理解可拋出的異常事件,整個類層次結構的一些部分要被提交。主要的類稱為Throwable。這個類擁有兩個子類:Exception和Error。一個異常事件對象應從Throwable的類中傳出。意味著它應該是Exception子類或Error子類的一個對象實例。這些都可以在Java.lang數據包中找到。

異常處理就是捕捉可能在運行時被拋出的異常事件的一項技術。Java通過try-catch-finally的異常處理語句為我們提供了強大的異常處理解決方案。而在另一方面,你也可以使用已經聲明的異常事件,如ArithmeticException, NullPointerException等。其他類擴展了Exception 類,如IOException子類。

此外,我們應該注意到異常事件包含了兩種情況:檢查過的和沒檢查的。技術上,我們認為沒檢查過的異常事件RuntimeExceptions。這些不需要在拋出的語句中作出聲明,而且對它們的捕捉也是選擇性的。不過,它們一般不會有什麼影響,如果程序員根本不能發現它們的存在。在大多數情況下,這些都是邏輯性的編程錯誤,如NullPointerException或者ArrayIndexOutOfBounds。

同時,對異常事件進行技術性檢查也迫使程序員對其進行處理和管理,意味著要對其進行單獨捕捉並覆蓋。這些都來自Exceptions類和它的子類,包括我們之前討論過的RuntimeExceptions。檢查過的異常事件要求異常事件處理因為它們有可能導致程序終止。

現在,我們對異常事件有了個基本的了解,下面就讓我們啟動集成開發環境開始編碼吧!

異常處理

前面我們提到了異常處理就是指處理代碼中的異常事件,或者在運行時向運行引擎拋出異常事件,在引擎末端它會搜索異常事件處理例程。它使用包含了一系列方法調用的調用堆棧進行搜索。

一般而言,異常事件可能因為包含一個異常活動或其他異步異常導致的。我們討論的異常事件包括了一些基本的處理議題:怎樣捕捉和處理這些異常事件。

Java允許我們創建自己的Exception對象和類,但是會有一個關鍵的請求。這些對象和類必須是擴展的Exception類。編碼標准要求異常事件應該充分命名,意味著它們的名字就代表了其本身。

throw new Exception(“ This is an exception!”)

下面,我們看看要怎樣捕捉和處理這些異常事件。檢查以下代碼:

try{

// this is the block of code where the exception happens

// sometimes called as source/root of exception

// or even called as tricky block or tricky method

catch{Exception_Typel e) {

// dealing with this kind of exception

Catch (Exception_Type2 e) {

// dealing witn this kind of exception

//... unlimited number of catches are possible

finally {

// this block of code is always executed

try-catch-finally語句的第一個部分是嘗試阻止。這是異常事件有可能發生的部分。通常,我們建議代碼行用最小的數量來編寫,因為它們只會在異常事件發生的時候執行。這種情況發生時,執行會跳轉去捕捉那些異常事件被比較的塊中。如果它們匹配,那麼就可以處理異常事件。

不論嘗試阻止的時候,異常事件會不會發生,或不管能不能得到處理,阻止總會執行。由於它總是被執行,所以我們推薦你在這裡做一些清理。因此,正如所預料的那樣,執行起來就是具有選擇性的。

Try-catch模塊的結構類似於switch-case的結構。在檢查過的需要處理的異常事件中,是有可能在相同方法中將其處理或者拋出的。後者可以通過關鍵詞拋出。在這種情況下,異常事件的種類必須在方法簽名中被指定。看這個例子:

Void myMethod () throws SomeKindOfException{

// method goes here

}

  接下來,我們將為大家展示更多的異常處理實例。

初學者常常與非匹配數據類型糾纏不清。通常,它們會引發一些問題,例如,在做加法時出現非數字型代碼。下面給大家展示的代碼中,出現了異常處理的工作環境。檢查該網頁以完成嵌入式Exception種類的清單。現在,我們要處理NumberFormatException 的發生。

public static void main (String args[] ) {

double sum= 0;

for (int i=0; i﹤args. length; ++1)

try {

sum+= Double.parseDboule (args[i]);

}

Catch (NumberFormatException e) {

System.out.printIn(args[i] + “non-numeric data on”);

}

  System.out.printIn(“Total sum: “+ sum);

}

正如你所見到的,它和命令行參數一起運行,而且一旦輪到非數字型參數,它就會寫入system.out,意指出現的問題。但是項目會繼續進行,因為try模塊是循環的。否則,沒有合適的異常處理,項目就會終止。用這種方式總和還是可以計算處理並在最後顯示處理。

我們來看看另一個例子。在這個例子中,我們會要建立自己的異常實例類,該類擴展了其母Exception類。應用程序會模擬用於異常處理和拋出的堆棧機制,如堆棧是滿的或者是空的。檢查一下。

Public class StackException extends Exception {

Public StackException (String text) {

Super (text)

}

}

  現在讓我們創建一個Stack類。注意push和pop方法。它們正拋出StackException,而這一動作由方法簽名導入。此外,還有一個if條件,且條件滿足時,異常事件會被拋出。否則,一切都會順利運行。

public class Stack {

private final int SIZE = 100;

private Object st[];

private int size;

private int sp;

public Stack (int size) {

if (size < MAXSIZE)

this.size = size;

else

this.size = MAXSIZE;

this.st = new Object [size];

this.sp = -1;

}

public void push (Object o) throws StackException {

if (sp == this.size - 1)

throw new StackException ("Stack is full");

this.st [++this.sp] = o;

}

public Object pop () throws StackException {

if (sp == -1)

throw new StackException ("Stack is empty");

Object o = this.st [this.sp];

this.sp--;

return o;

}

public boolean isEmpty() {

return this.sp == -1;

}

}

好的,現在是時候寫一寫Main class連同主要方法了。在這一部分,請對try-catch語句給予更多關注。有兩類異常情況可以被捕捉到。你也可以很容易地找出它們。 

public class Main {

public static void main (String args[]) {

Stack s = new Stack (10);

for (int i = 0; i <= 10; ++i)

try {

s.push (new Integer(i));

}

catch (StackException e) {

  System.out.println (e);

}

while (! s.isEmpty() ) {

try {

System.out.println( (Integer)(s.pop()) );

}

catch (StackException e) {

System.out.println(e);

}

}

}

}

  當然,這裡也會有附帶輸出。如你所見,第一行顯示出的就是異常事件,因為我們要用11個要素填補堆棧,因此,在循環到isEmpty是錯誤的時,異常事件不會拋出。

Stack is full

練習幾次以上的幾段代碼。如果異常事件被拋出但是卻能夠正確被處理那就不要感到驚訝。這就是異常處理的神奇之處。

總結

在這篇文章裡我們就異常處理的實用性和重要性進行了分析。我們都知道,不管是檢查過的或是未經檢查的,程序員都要處理好異常事件,否則可能出現程序的異常終止。我們強調要將理論與實踐相結合。坦率地說,本文雖只是冰山一角,但一些基本的知識已經介紹給了大家。希望能在異常處理方面對大家有所幫助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved