对异常类的理解
import java.io.*;
class Excep
{
Excep() throws ArithmeticException
{
}
public int division(int a,int b) throws ArithmeticException,DivisorIsMinusException//Exception
{
//try
//{
if(b<0)
throw new DivisorIsMinusException("Divisor can't be minus");
return a/b;
/*}
catch(ArithmeticException e)
{
e.printStackTrace();
throw new Exception("can't divide by zero");
//throw e;
//return 0;
}*/
}
public int fn1(int a,int b) throws ArithmeticException,DivisorIsMinusException//Exception
{
return division(a,b);
}
}
class ChildExcep extends Excep
{
ChildExcep() throws FileNotFoundException
{
}
public int division(int a,int b) throws ArithmeticException,DivisorIsMinusException
{
return a/b;
}
}
class DivisorIsMinusException extends Exception
{
DivisorIsMinusException(String str)
{
super(str);
}
}
class ExcepTest
{
public static int method1(Excep excep)
{
try
{
return excep.division(5,0);
}
catch(ArithmeticException e)
{
System.out.println(e.toString());
}
catch(DivisorIsMinusException ex)
{
System.out.println(ex.toString());
//System.exit(-1);
//return;
}
return 0;
}
public static void main(String[] args) //throws Exception
{
ChildExcep ce=new ChildExcep();
method1(ce);
Excep excep=new Excep();
try
{
//excep.division(5,0);
excep.fn1(5,-1);
System.out.println("exception");
return;
}
catch(ArithmeticException e)
{
System.out.println(e.toString());
}
catch(DivisorIsMinusException ex)
{
System.out.println(ex.toString());
System.exit(-1);
//return;
}
catch(Exception e)
{
//System.out.println("can't divide by zero");
//System.out.println(e.getMessage());
//System.out.println(e.toString());
e.printStackTrace();
}
finally
{
System.out.println("finally");
}
System.out.println("finish");
}
}
1. 程序发生异常,如果不使用try/catch 进行捕获会发生编译错误,当然RuntimeException类的异常除外,这类异常包括ArithmeticException、NullPointerException、IndexOutOfBoundException等,这些都属于程序编写时的错误,不需要我们去捕获,java虚拟机会自动抛出并自动捕获。注意只要我们写上了 catch()语句就是进行了捕获,就算是空实现,这时编译器不会报错。如果我们进行了异常的捕获,当程序运行到try语句中的异常语句时就会发生错误,异常语句后面的语句将不会执行,程序会直接跳转到相应的catch语句进行处理,处理完毕后,如果catch(){_}后面还有语句可以继续执行。
2. 在catch语句中常用的处理方法有,toString() 打印出一个较为详细的异常描述。getMessage()打印出一个简单的异常描述。printStackTrace()用来打印出异常的轨迹,这个方法可以用在我们进行编码调试阶段。如果我们将异常抛给java 虚拟机,那么系统捕获到异常时打印出的信息和我们调用 pringStackTrace()是相似的。
3. 定义一个方法时,我们可以用throws关键字声明抛出异常,那么在调用这个方法的另外的方法体中应该进行捕获或者继续抛出,不然编译器回报错,这样下去直到将异常抛给java 虚拟机。注意在对抛出的异常进行捕获时要注意一种对应关系,一般来说,抛出的是什么异常就要捕获什么样的异常,你捕获的异常只能够比抛出的异常范围更广,不然编译器会报错。而且如果你同时写了很多个catch语句,注意将catch(Exception ex)语句放到最后,不然的话,便宜器会报错说异常已经捕获,这就是因为 Exception是所有异常类的基类的原因吧。在实际饿运行期间,使用哪个catch()语句进行的捕获,还是要看抛出异常和捕获异常的对应关系。
4. 注意使用throws和 throw,使用这个关键字时要对应,不然编译时会报错。我们可以定义自己的异常类,从Exception来继承,并在方法中进行抛出比如我们定义的异常类的名字是IsMinusException(String s)我们可以用throw IsMinusException(“is a minus Exception.”)。
5. 如果我们写一个类,它继承自一个类,在这个父类中有一个方法声明抛出了两个异常,那么我们在子类中重写这个方法,我们要抛出的异常只能是和原来的方法抛出的异常相同或是原来异常的子集或子类。但是构造函数除外,因为构造函数不会被继承。我想之所以会这样,就是因为多态性的原因吧。
6. 学会使用finally()语句进行最后的处理,因为它不管在什么情况下都会执行,除非在try语句中使用了System.exit()语句,中断了程序。发生或是不发生异常,或是 是在try中使用了return 语句(我们经常会这样做)都不会影响finally语句的执行,但如果使用了return语句那么catch()后面的语句将不会执行。所以finally语句经常用在连接数据库时进行最后资源的释放。要注意在进行资源释放的时候,要进行判断看数据库连接是否已经建立或文件是否打开。(IF( CONN !=NULL))THEN (///)
7. 我们编写程序时要尽量编写详尽的异常捕获使我们的程序更加的健壮。
以上程序代码摘自 孙鑫 老师的java视频基础课程。特此声明。