一、遞歸
方法直接或者間接調用本身
將大問題, 層層轉化為一個與原問題相似的、規模更小的問題來解決
二、異常
程序在編譯或執行過程中,出現的非正常的情況 (錯誤)
語法錯誤不是異常
1、閱讀異常信息
從下往上看:發生異常的位置、異常名稱、發生異常的原因
Java 中的所有異常都是類
2、異常的體系結構
(1)Error
嚴重級別問題
常見的 : 棧內存溢出 (StackOverflowError) ?堆內存溢出 (OutOfMemoryError)
(2)Exception:
RuntimeException 及其子類:運行時異常
編譯階段沒有錯誤,運行時可能會出現的錯誤,通常是程序員代碼不嚴謹造成的
除RuntimeException 之外所有的異常:編譯時異常
編譯階段就出現的錯誤,主要起到提醒作用
三、異常的處理方式
1、Java 對于異常的默認處理方式:向上拋出
虛擬機會在出現異常的代碼那里自動的創建一個異常對象:例如 ArithmeticException
異常會從方法中出現的點這里拋出給調用者,調用者最終拋出給JVM虛擬機
虛擬機接收到異常對象后,先在控制臺直接輸出異常信息數據
隨后終止 Java 程序的運行
后續代碼沒有機會執行了,因為程序已經被終止了
2、異常處理方式:try...catch...
異常可以被捕獲,執行處理方案,后續的代碼也可以繼續執行
System.out.println("start");
try {int[] a = {1, 2};int[] b = null;System.out.println(b[0]); // new NullPointerException()System.out.println(a[2]);System.out.println(10 / 0);
} catch (ArithmeticException e) {System.out.println("ArithmeticException");
} catch (NullPointerException e) { // NullPointerException e = 上面的異常對象System.out.println("NullPointerException");
} catch (ArrayIndexOutOfBoundsException e) {System.out.println("ArrayIndexOutOfBoundsException");
} catch (Exception e) {System.out.println("Exception");
}
System.out.println("end");輸出:
start
NullPointerException
end
Tips:如果使用多個catch, 最大的異常需要放在最后
3、throws 拋出異常
(1)throws:用在方法上,作用是聲明,聲明這個方法中有可能會出現異常
格式:public void method() throws 異常1,異常2,異常3... { }
(2)throw : 用在方法中, 后面跟的是異常對象, 其作用是拋出異常對象
拋出的異常對象如果是編譯時異常, ?必須使用 throws 聲明
如果是運行時異常, 則不需要寫 throws
public void setAge(int age) throws Exception {if (age >= 0 && age <= 120) {this.age = age;} else {throw new Exception("年齡錯誤,應在0-120歲之間"); // 拋出編譯時異常}
}
4、兩種方式的選擇
看這個異常是否需要暴露出來
需要:拋出
不需要:try…catch
四、自定義異常
Java無法為這個世界上全部的問題提供異常類
如果企業想通過異常的方式來管理自己的某個業務問題,就需要自定義異常
1、自定義編譯時異常
定義一個異常類繼承Exception,重寫構造器
2、自定義運行時異常
定義一個異常類繼承RuntimeException,重寫構造器
public class AgeException extends RuntimeException {public AgeException() {}public AgeException(String message) {super(message);}
}// --------public void setAge(int age) {if (age >= 0 && age <= 120) {this.age = age;} else {throw new AgeException("年齡錯誤,應在0-120歲之間");}
}
五、異常的細節
1、Throwable的常用方法
public?String?getMessage() | |
public?void?printStackTrace() |
2、子類重寫父類方法時,不能拋出父類沒有的異常,或者比父類更大的異常