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();
}
}