1.對異常處理的語法檢查是在編譯期進行的,而非運行期。也就是說即使某拋出了異常但未被正確處理的方法,在執行期並未被真正調用,也會編譯出錯。如下面的
ExtendExcepDemo1.java代碼中,Test類中建立了A類的對象a,並調用了a的方法show(),儘管在main()函數中並未調用function1,但仍會在編譯期間出錯。
//ExtendExcepDemo1.java代碼
class AException extends Exception
{
}
class A
{
public void show() throws AException
{
System.out.println("Hello AException!");
}
}
class Test
{
void function1() //throws AException 第一種方法:拋出異常
{
A a=new A();
a.show();
// a.show(); 第三種方法:不調用show()方法
/* 第二種方法:捕獲異常並處理
try
{
A a=new A();
a.show();
}
catch (AException a)
{
}
*/
}
void function2()
{
System.out.println("Hello rui");
}
}
class ExtendExcepDemo1
{
public static void main(String[] args)
{
Test t=new Test();
t.function2();
}
}
解決編譯出錯的方法有以下三種:如代碼中註釋部分
一是拋出異常;
二是捕獲並處理異常;
三是取消對方法show()的調用。
其中第三種方法也表明,異常的拋出與處理是針對方法的,儘管建立了A類對象,但只要不調用異常相關的方法,仍然不會編譯出錯。
2.一個方法若拋出了異常,那麼任何調用該方法的方法都必須拋出異常或捕獲異常(但當其中的某一級方法捕獲並處理異常後,之後再調用該方法便無需處理異常)。
如ExtendExcepDemo1.java代碼中,由於A類的show()方法拋出了異常,那麼在Test類中的function1方法若調用了show()方法,就必須拋出異常或捕獲AException異常。
(1)若function1方法選擇拋出異常,那麼ExtendExcepDemo1類中的main()函數就必須拋出異常(給虛擬機)或捕獲異常並處理,參考ExtendExcepDemo2.java中的代碼:
//ExtendExcepDemo2代碼
class AException extends Exception
{
}
class A
{
public void show() throws AException
{
System.out.println("Hello AException!");
}
}
class Test
{
void function1() throws AException
{
A a=new A();
a.show();
}
void function2()
{
System.out.println("Hello rui");
}
}
class ExtendExcepDemo2
{
public static void main(String[] args) throws AException
{
Test t=new Test();
t.function2();
}
}
(2)若function1方法捕獲並處理異常,那麼ExtendExcepDemo1類中的main()函數就無需再對異常做任何拋出或捕獲操作,參考ExtendExcepDemo3.java中的代碼:
//ExtendExcepDemo3代碼
class AException extends Exception
{
}
class A
{
public void show() throws AException
{
System.out.println("Hello AException!");
}
}
class Test
{
void function1()
{
try
{
A a=new A();
a.show();
}
catch (AException e)
{
}
}
void function2()
{
System.out.println("Hello rui");
}
}
class ExtendExcepDemo3
{
public static void main(String[] args)
{
Test t=new Test();
t.function2();
}
}