1. 拋出異常
通過throw new ThrowableClass語法可以拋出一個異常,其中ThrowableClass是一個從Throwable繼承的類,或者是Throwable類本身,先看下面的
view plaincopy to clipboardprint?
public void proc(){
// Exception是Throwable的繼承類,代表最基本的異常
throw new Exception(“hello”);
}
public void proc(){
// Exception是Throwable的繼承類,代表最基本的異常
throw new Exception(“hello”);
}
上面的代碼會導致編譯錯誤,對於有拋出異常的方法,編譯器強制要求:要麼在方法上聲明要拋出的異常(稱為異常說明),要麼在方法中用try塊捕獲這個異常。
view plaincopy to clipboardprint?
// 用異常說明,說明該方法要拋出的異常
public void proc() throws Exception{
throw new Exception(“hello”);
}
// 用try塊捕獲該異常
public void proc(){
try {
throw new Exception(“hello”);
} catch (Exception e) {
e.printStackTrace();
}
}
// 用異常說明,說明該方法要拋出的異常
public void proc() throws Exception{
throw new Exception(“hello”);
}
// 用try塊捕獲該異常
public void proc(){
try {
throw new Exception(“hello”);
} catch (Exception e) {
e.printStackTrace();
}
}
異常說明可以是方法拋出的異常類本身,也可以是異常類的基類,比如throws後面可以是throwable。
上面說到對於有拋出異常的方法,必須帶有方法聲明,這並不準確,當拋出的異常類是RuntimeException或其繼承類時,不需要異常說明:
view plaincopy to clipboardprint?
// RuntimeException或其繼承類不需要異常聲明
public void proc(){
throw new RuntimeException(“hello”);
}
// RuntimeException或其繼承類不需要異常聲明
public void proc(){
throw new RuntimeException(“hello”);
}
一個方法即使內部沒有拋出異常,也仍然可以帶有異常說明:
view plaincopy to clipboardprint?
public void proc2() throws NullPointerException, FileNotFoundException {
}
public void proc2() throws NullPointerException, FileNotFoundException {
}
一個方法若帶有異常說明,則調用它的其他方法也要帶有異常說明,或者要捕獲可能拋出的異常:
view plaincopy to clipboardprint?
class A {
public void proc() throws Exception {
throw new Exception(“hello”);
}
// 異常聲明
public void proc1() throws Exception {
proc();
}
// 異常聲明,聲明中的類可以是基類
public void proc2() throws Throwable {
proc();
}
// 直接捕獲異常
public void proc3() {
try {
proc();
} catch (Exception e) {
e.printStackTrace();
}
}
}
class A {
public void proc() throws Exception {
throw new Exception(“hello”);
}
// 異常聲明
public void proc1() throws Exception {
proc();
}
// 異常聲明,聲明中的類可以是基類
public void proc2() throws Throwable {
proc();
}
// 直接捕獲異常
public void proc3() {
try {
proc();
} catch (Exception e) {
e.printStackTrace();
}
}
}
可以基於Exception現實自己的異常類:
view plaincopy to clipboardprint?
class MyException1 extends Exception {
}
class MyException2 extends Exception {
}
class A {
public void proc() throws MyException1, MyException2{
}
}
class MyException1 extends Exception {
}
class MyException2 extends Exception {
}
class A {
public void proc() throws MyException1, MyException2{
}
}
2. 捕獲異常和結束清理
用try{}塊包圍住可能引發異常的代碼,後面緊跟著異常處理器(即catch(…){}塊);catch塊可以有多個,()中聲明要捕獲的異常類。當try塊拋出一個異常時,執行代碼將跳到catch塊去,並從第一個catch塊開始匹配,直到找到符合的catch塊。請看下面的代碼說明:
view plaincopy to clipboardprint?
class MyException1 extends Exception {
}
class MyException2 extends Exception {
}
class MyException3 extends Exception {
}
class A {
public void proc() throws Exception{
try{
// 僅僅為瞭演示用
Random random = new Random();
int i = random.nextInt(3);
if (i == 0)
throw new MyException1();
else if (i == 1)
throw new MyException2();
else if (i == 2)
throw new MyException3();
}
catch(MyException1 e){
// 當拋出MyException1時會跳到這裡來。
e.printStackTrace();
}
catch(MyException2 e){
// 當