JAVA基礎之異常處理
我們在程式執行的過程中出現錯誤時很正常的,出錯,我們的程式碼執行就會停止,那麼我們可以使用異常處理來幫助程式設計師檢查可能出現的問題。
1.java中異常的分類,分為:java.lang.Error和java.lang.Exception,java.lang.Throwable類是兩種的父類。
2.java異常處理機制。
2.1捕獲異常
2.2宣告丟擲異常
3.異常處理
異常處理共涉及五個關鍵字:try,catch,throw,throws,finally。
自行處理:可能引發異常的語句封裝在try在,而處理異常的語句在catch內。
丟擲異常:在方法宣告中包括throws子句,通知呼叫者,如果發生了異常,必須有呼叫者處理。
異常的例子:
package com.dh.ch06;
/**
* 測試異常的發生
*/
public class ExceptionDemo {
public static void main(String[] args) {
// 0做除數
int i = 12 / 0;
System.out.println("結果是:" + i);
}
}
很明顯會發生異常:
Exception in thread "main" java.lang.ArithmeticException: / by zero at com.dh.ch06.ExceptionDemo.main(ExceptionDemo.java:8)
try catch例子:
package com.dh.ch06; public class TryCatchDemo { public static void main(String[] args) { //定義一個String變數,值為null String str = null; try { if (str.equals("hello")) { System.out.println("hello java"); } } catch (NullPointerException e) { System.out.println("空指標異常"); } } }
空指標異常
多重catch異常處理例子:
package com.dh.ch06;
import java.util.Scanner;
/**
* 多重catch的使用方法
*/
class MoreCatchDemo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a[] = new int[2];
try {
// 從鍵盤獲取一個字串
String str = scanner.next();
// 將字串轉換成整數(會引發NumberFormatException)
int num1 = Integer.parseInt(str);
// 從鍵盤獲取一個整數
int num2 = scanner.nextInt();
// 將兩個數相除(會引發Exception),並賦值給a[1]
a[1] = num1 / num2;
// 給a[2]賦值(引發ArrayIndexOutOfBoundsException)
a[2] = num1 * num2;
System.out.println("OK!");
} catch (ArrayIndexOutOfBoundsException ex) {
System.out.println("陣列越界異常!");
} catch (NumberFormatException ex) {
System.out.println("數字轉換異常!");
} catch (Exception ex) {
System.out.println("其他異常!");
}
}
}
你輸入的內容不同會引發不一樣的異常。
當一個catch語句捕獲到異常的的時候,後面的catch是不會再執行的。捕獲異常的順序和catch語句的順序有有關,所以我們在安排catch語句的時候要先安排特殊的異常,然後是一些普通的異常。
巢狀異常處理:
在使用巢狀的try塊時,將先執行內部的try,如果沒有遇到匹配的catch快,則將檢查外部的try catch。
package com.dh.ch06;
import java.util.Scanner;
/**
* 巢狀try-catch的使用
*/
public class NestedExceptionDemo {
public static void main(String[] args) {
try {
try {
Scanner scanner = new Scanner(System.in);
// 從控制檯中傳入兩個引數
int number1 = Integer.parseInt(scanner.next());
int number2 = Integer.parseInt(scanner.next());
// 求商運算
double result = number1 / number2;
System.out.println("the result is " + result);
} catch (NumberFormatException e) {
System.out.println("數字格式轉換異常!");
}
} catch (ArithmeticException e) {
System.out.println("0做除數無意義!");
}
}
}
finally,在某些特定的情況下,不管是否有異常,都要執行一些語句,比如資料庫連線時,不管對資料庫的操作是否成功,最後都需要關閉資料庫。
package com.dh.ch06;
/**
* try-catch-finally的使用,模擬資料的操作
*/
public class FinallyDemo {
public static void main(String[] args) {
System.out.println("請開啟資料庫連線......");
try {
System.out.println("執行查詢操作");
System.out.println("執行修改操作");
// 使用0做除數
int i = 12 / 0;
System.out.println("結果是:" + i);
} catch (Exception ex) {
System.out.println("除零出錯!");
} finally {
System.out.println("請關閉資料庫連線......");
}
}
}
4。自定義異常:
自定義異常只需建立一個類繼承Execption即可,
在程式中使用自定義的異常,可以分為這幾個步驟:
(1):建立自定義異常類
(2):在方法中通過throw關鍵字丟擲異常物件
(3)如果在當前丟擲異常的方法中處理異常,可以使用try——catch語句塊來捕獲並處理,否則在方法中生宣告throws關鍵字指明要拋給的呼叫者的異常。
(4):在出現異常的方法呼叫者中處理異常。
例子:
package com.dh.ch06;
public class MyExecption extends Exception{
public MyExecption(String ErrorMessage){
super(ErrorMessage);
}
}
/**
*
*/
package com.dh.ch06;
import java.nio.charset.MalformedInputException;
public class Tran {
public static int vag(int a,int b) throws MyExecption{
if(a<0 || b<0){
throw new MyExecption("不可以為負數");
}
if(a>100 || b>100){
throw new MyExecption("不能大於100");
}
return a+b;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
try{
int result = vag(100,120);
System.out.println(result);
}catch(MyExecption e)
{
System.out.println(e.getMessage());
}
}
}
5.在方法中丟擲異常:
throws關鍵字主要在宣告方法的時候丟擲異常,多個異常可以用逗號隔開。
例子:
package com.dh.ch06;
public class Shoot {
public static void pop()throws NegativeArraySizeException {
int a[] = new int[-3];
}
public static void main(String[] args){
// TODO Auto-generated method stub
try{
pop();
}catch(NegativeArraySizeException e){
System.out.println("pop方法出錯");
}
}
}
下一篇是集合與泛型