java異常的處理
Ⅰ 在java中常出現的異常和解決方法
1. java.lang.nullpointerexceptionx0dx0a 這個異常大家肯定都經常遇到,異常的解釋是"程序遇上了空指針",簡單地說就是調用了未經初始化的對象或者是不存在的對象,這個錯誤經常出現在創建圖片,調用數組這些操作中,比如圖片未經初始化,或者圖片創建時的路徑錯誤等等。對數組操作中出現空指針,很多情況下是一些剛開始學習編程的朋友常犯的錯誤,襲悔即把數組的初始化和數組元素的初始化混淆起來了。數組的初始化是對數組分配需要的空間,而初始化後的數組,其中的元素並沒有實例化,依然是空的,所以還需要對每個元素都進行初始化(如果要調用的話)x0dx0ax0dx0a 2. java.lang.classnotfoundexceptionx0dx0a 這個異常是很多原本在jb等開發環境中開發的程序員,把jb下的程序包放在wtk下編譯經常出現的問題,異常的解釋是"指定的類不存在",這里主要考慮一下類的名稱和路徑是否正確即可,如果是在jb下做的程序包,一般都是默認加上package的,所以轉到wtk下後要注意把package的路徑加上。x0dx0ax0dx0a 3. java.lang.arithmeticexceptionx0dx0a 這個異常的解釋是"數學運算異常",比如程序中出現了除以零這樣的運算就會出這樣的異常,對這種異常,大家就要好好檢查一下自己程序中涉及到數學運算的地方,公式是不是有不妥了。x0dx0ax0dx0a 4. java.lang.x0dx0a 這個異常相信很多朋友也經常遇到過,異常的解釋是"數組下標越界",現在程序中大多都有對數組的操作,因此在調用數組的時候一定要認真檢查,看自己調用的下標是不是超出了數組的范圍,一般來說,顯示(即直接用常數當下標)調用不太容易出這樣的錯,但隱式(即用變數表示下標)調用就經常出錯了,還有一種情況,是程序中定義的數組的長度是通過某些特定方法決定的,不是事先聲明的,這個時候,最好先查看一下數組的length,以免出現這個異常。x0dx0ax0dx0a 5. java.lang. 這個異常的解釋是"方法的參數錯誤",很多j2me的類庫中的方法在一些情況下都會引發這樣的錯誤,比如音量調節方法中的音量參數如果寫成負數就會出現這個異常,再比如g.setcolor(int red,int green,int blue)這個方法中的三個值,如果有超過255的也會出現這個異常,因此一旦發現這個異常,我們要做的,就是趕緊去檢查一下方法調用中的參數傳遞是不是出現了錯誤。x0dx0ax0dx0a 6. java.lang.illegalaccessexceptionx0dx0a 這個異常的解釋是"沒有訪問許可權",當應用程序要調用一個類,但當前的方法即沒有對該類的訪問許可權便會出現這個異常。對程序中用了package的情況下要注意這個異常。x0dx0ax0dx0a 其他還有很多異常,我就不一一列舉了,我要說明的是,一個合格的程序員,需要對程序中常見的問題察慎有相當的了解和相應的解決辦法,否則僅僅停留在寫程序而不會改程序的話,會極大影響到自己的開發的。關於異常的全部說明,在api里敗禪敬都可以查閱。x0dx0ax0dx0a算術異常類:空指針異常類:類型強制轉換異常:數組負下標異常:數組下標越界異常:x0dx0ax0dx0a違背安全原則異常:文件已結束異常:EOFExceptionx0dx0ax0dx0a文件未找到異常:字元串轉換為數字異常:操作資料庫異常:SQLExceptionx0dx0ax0dx0a輸入輸出異常:IOExceptionx0dx0ax0dx0a方法未找到異常:.lang.抽象方法錯誤。當應用試圖調用抽象方法時拋出。x0dx0ax0dx0ajava.lang.AssertionErrorx0dx0ax0dx0a斷言錯。用來指示一個斷言失敗的情況。x0dx0ax0dx0ajava.lang.類循環依賴錯誤。在初始化一個類時,若檢測到類之間循環依賴則拋出該異常。x0dx0ax0dx0ajava.lang.ClassFormatErrorx0dx0ax0dx0a類格式錯誤。當Java虛擬機試圖從一個文件中讀取Java類,而檢測到該文件的內容不符合類的有效格式時拋出。x0dx0ax0dx0ajava.lang.Errorx0dx0ax0dx0a錯誤。是所有錯誤的基類,用於標識嚴重的程序運行問題。這些問題通常描述一些不應被應用程序捕獲的反常情況。x0dx0ax0dx0ajava.lang.初始化程序錯誤。當執行一個類的靜態初始化程序的過程中,發生了異常時拋出。靜態初始化程序是指直接包含於類中的static語句段。x0dx0ax0dx0ajava.lang.違法訪問錯誤。當一個應用試圖訪問、修改某個類的域(Field)或者調用其方法,但是又違反域或方法的可見性聲明,則拋出該異常。x0dx0ax0dx0ajava.lang.不兼容的類變化錯誤。當正在執行的方法所依賴的類定義發生了不兼容的改變時,拋出該異常。一般在修改了應用中的某些類的聲明定義而沒有對整個應用重新編譯而直接運行的情況下,容易引發該錯誤。x0dx0ax0dx0ajava.lang.實例化錯誤。當一個應用試圖通過Java的new操作符構造一個抽象類或者介面時拋出該異常.x0dx0ax0dx0ajava.lang.InternalErrorx0dx0ax0dx0a內部錯誤。用於指示Java虛擬機發生了內部錯誤。x0dx0ax0dx0ajava.lang.LinkageErrorx0dx0ax0dx0a鏈接錯誤。該錯誤及其所有子類指示某個類依賴於另外一些類,在該類編譯之後,被依賴的類改變了其類定義而沒有重新編譯所有的類,進而引發錯誤的情況。x0dx0ax0dx0ajava.lang.未找到類定義錯誤。當Java虛擬機或者類裝載器試圖實例化某個類,而找不到該類的定義時拋出該錯誤。x0dx0ax0dx0ajava.lang.NoSuchFieldErrorx0dx0ax0dx0a域不存在錯誤。當應用試圖訪問或者修改某類的某個域,而該類的定義中沒有該域的定義時拋出該錯誤。x0dx0ax0dx0ajava.lang.NoSuchMethodErrorx0dx0ax0dx0a方法不存在錯誤。當應用試圖調用某類的某個方法,而該類的定義中沒有該方法的定義時拋出該錯誤。x0dx0ax0dx0ajava.lang.OutOfMemoryErrorx0dx0ax0dx0a內存不足錯誤。當可用內存不足以讓Java虛擬機分配給一個對象時拋出該錯誤。x0dx0ax0dx0ajava.lang.堆棧溢出錯誤。當一個應用遞歸調用的層次太深而導致堆棧溢出時拋出該錯誤。x0dx0ax0dx0ajava.lang.ThreadDeathx0dx0ax0dx0a線程結束。當調用Thread類的stop方法時拋出該錯誤,用於指示線程結束。x0dx0ax0dx0ajava.lang.UnknownErrorx0dx0ax0dx0a未知錯誤。用於指示Java虛擬機發生了未知嚴重錯誤的情況。x0dx0ax0dx0ajava.lang.未滿足的鏈接錯誤。當Java虛擬機未找到某個類的聲明為native方法的本機語言定義時拋出。x0dx0ax0dx0ajava.lang.不支持的類版本錯誤。當Java虛擬機試圖從讀取某個類文件,但是發現該文件的主、次版本號不被當前Java虛擬機支持的時候,拋出該錯誤。x0dx0ax0dx0ajava.lang.VerifyErrorx0dx0ax0dx0a驗證錯誤。當驗證器檢測到某個類文件中存在內部不兼容或者安全問題時拋出該錯誤。x0dx0ax0dx0ajava.lang.虛擬機錯誤。用於指示虛擬機被破壞或者繼續執行操作所需的資源不足的情況。x0dx0ax0dx0ajava.lang.算術條件異常。譬如:整數除零等。x0dx0ax0dx0ajava.lang.x0dx0ax0dx0a數組索引越界異常。當對數組的索引值為負數或大於等於數組大小時拋出。x0dx0ax0dx0ajava.lang.數組存儲異常。當向數組中存放非數組聲明類型對象時拋出。x0dx0ax0dx0ajava.lang.類造型異常。假設有類A和B(A不是B的父類或子類),O是A的實例,那麼當強制將O構造為類B的實例時拋出該異常。該異常經常被稱為強制類型轉換異常。x0dx0ax0dx0ajava.lang.找不到類異常。當應用試圖根據字元串形式的類名構造類,而在遍歷CLASSPAH之後找不到對應名稱的class文件時,拋出該異常。x0dx0ax0dx0ajava.lang.不支持克隆異常。當沒有實現Cloneable介面或者不支持克隆方法時,調用其clone()方法則拋出該異常。x0dx0ax0dx0ajava.lang.x0dx0ax0dx0a枚舉常量不存在異常。當應用試圖通過名稱和枚舉類型訪問一個枚舉對象,但該枚舉對象並不包含常量時,拋出該異常。x0dx0ax0dx0ajava.lang.Exceptionx0dx0ax0dx0a根異常。用以描述應用程序希望捕獲的情況。x0dx0ax0dx0ajava.lang.違法的訪問異常。當應用試圖通過反射方式創建某個類的實例、訪問該類屬性、調用該類方法,而當時又無法訪問類的、屬性的、方法的或構造方法的定義時拋出該異常。x0dx0ax0dx0ajava.lang.違法的監控狀態異常。當某個線程試圖等待一個自己並不擁有的對象(O)的監控器或者通知其他線程等待該對象(O)的監控器時,拋出該異常。x0dx0ax0dx0ajava.lang.違法的狀態異常。當在Java環境和應用尚未處於某個方法的合法調用狀態,而調用了該方法時,拋出該異常。x0dx0ax0dx0ajava.lang.違法的線程狀態異常。當縣城尚未處於某個方法的合法調用狀態,而調用了該方法時,拋出異常。x0dx0ax0dx0ajava.lang.索引越界異常。當訪問某個序列的索引值小於0或大於等於序列大小時,拋出該異常。x0dx0ax0dx0ajava.lang.實例化異常。當試圖通過newInstance()方法創建某個類的實例,而該類是一個抽象類或介面時,拋出該異常。x0dx0ax0dx0ajava.lang.被中止異常。當某個線程處於長時間的等待、休眠或其他暫停狀態,而此時其他的線程通過Thread的interrupt方法終止該線程時拋出該異常。x0dx0ax0dx0ajava.lang.數組大小為負值異常。當使用負數大小值創建數組時拋出該異常。x0dx0ax0dx0ajava.lang.屬性不存在異常。當訪問某個類的不存在的屬性時拋出該異常。x0dx0ax0dx0ajava.lang.方法不存在異常。當訪問某個類的不存在的方法時拋出該異常。x0dx0ax0dx0ajava.lang.空指針異常。當應用試圖在要求使用對象的地方使用了null時,拋出該異常。譬如:調用null對象的實例方法、訪問null對象的屬性、計算null對象的長度、使用throw語句拋出null等等。x0dx0ax0dx0ajava.lang.數字格式異常。當試圖將一個String轉換為指定的數字類型,而該字元串確不滿足數字類型要求的格式時,拋出該異常。x0dx0ax0dx0ajava.lang.RuntimeExceptionx0dx0ax0dx0a運行時異常。是所有Java虛擬機正常操作期間可以被拋出的異常的父類。x0dx0ax0dx0ajava.lang.SecurityExceptionx0dx0ax0dx0a安全異常。由安全管理器拋出,用於指示違反安全情況的異常。x0dx0ax0dx0ajava.lang.x0dx0ax0dx0a字元串索引越界異常。當使用索引值訪問某個字元串中的字元,而該索引值小於0或大於等於序列大小時,拋出該異常。x0dx0ax0dx0ajava.lang.類型不存在異常。當應用試圖
Ⅱ JAVA語言如何進行異常處理
Java通過面向對象的方法進行異常處理,把各種不同的異常進行分類,並提供了良好的介面。
在Java中,每個異常都是一個對象,它是Throwable類或其子類的實例。當一個方法出現異常後便拋出一個異常對象,該對象中包含有異常信息,調用這個對象的方法可以捕獲到這個異常並可以對其進行處理。
Java的異常處理是通過5個關鍵詞來實現的:try、catch、throw、throws和finally。一般情況下是用try來執行一段程序,如果系統會拋出(throw)一個異常對象,可以通過它的類型來捕獲(catch)它,或通過總是執行代碼塊(finally)來處理;try用來指定一塊預防所有異常的程序;
catch子句緊跟在try塊後面,用來指定你想要捕獲的異常的類型;
throw語句用來明確地拋出一個異常;
throws用來聲明一個方法可能拋出的各種異常(當然聲明異常時允許無病呻吟);
finally為確保一段代碼不管發生什麼異常狀況都要被執行。
Ⅲ 應用技巧: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) {
Ststem.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
練習幾次以上的幾段代碼。如果異常事件被拋出但是卻能夠正確被處理那就不要感到驚訝。這就是異常處理的神奇之處。
總結
在這篇文章里我們就異常處理的實用性和重要性進行了分析。我們都知道,不管是檢查過的或是未經檢查的,程序員都要處理好異常事件,否則可能出現程序的異常終止。我們強調要將理論與實踐相結合。坦率地說,本文雖只是冰山一角,但一些基本的知識已經介紹給了大家。希望能在異常處理方面對大家有所幫助。
Ⅳ Java是怎樣處理異常問題的
第一:try{}catch{}捕捉異常處理。
try語句裡面實現的是主事件流,而catch裡面實現的是異常流。
自定義大量的Exception類,只是代表非主事件流的發生的,用來進行那些分支流程的流程式控制制的。
在異常捕獲後返回一個變數,該變數參與正常的業務流程。
第二:業務層處理業務時拋出異常,下次處理。(會影響性能)
返回變數是一種做法;拋出異常是一種做法。
而不是兩者都用,返回變數是面向過程的編程方法;拋出異常更OO。
Ⅳ Java 求大神們解答:自定義異常,處理異常
Java 允許我們定義自己的異常,這樣的異常就稱為自定義異常。定義自定義異常的方式是繼承 Exception 類,然後定義一個類來代表該異常。
下面是定義自定義異常類的示例:
================
public class MyException extends Exception {
public MyException() {
super();
}
public MyException(String message) {
super(message);
}
}
================
這里定義了一個名為 MyException 的類,它繼承了 Exception 類,並定義了兩個構造方法,一個是無參構造方法,另一個是帶有一個字元串參數的構造方法,該字元串參數用於傳入錯誤信息。
接下來,我們可以在可能拋出異常的方法中使用 throws 關鍵字聲明該方法可能拋出的異常,並在方法中使用 throw 語句拋出異常。例如:
================
public class UsingMyException {
public void f() throws MyException {
System.out.println("拋出異常MyException 從 f()方法");
throw new MyException();
}
public void g() throws MyException {
System.out.println("拋出異常MyException 從 g()方法");
throw new MyException("從g()方法中拋出異常");
}
}
================
這里我們定義了一個名為 UsingMyException 的類,它包含兩個方法: f() 和 g()。兩個方法都使用了 throws 關鍵字聲明它們可能會拋出 MyException 異常,並在方法內部使用 throw 語句拋出該異常