您的位置:首页 > 编程语言 > Java开发

【Java】学习笔记——异常处理

2009-04-09 17:42 441 查看
异常类的层次结构



注意:

RuntimeException定义的类为不需处理的类,而其他的例如IOException定义的类则必须处理,否则编译器会报错。

什么是异常

打开一个不存在的文件、网络连接中断、数组下标越界、正在加载的类文件丢失等都会引发异常。

Java中的异常类定义了程序中遇到的轻微的错误条件。

Java中的错误类定义了程序中不能恢复的严重错误条件。如内存溢出、类文件格式错误等。这一类错误由Java运行系统处理,不需要我们去处理。

异常处理

Java程序在执行过程中如出现异常,会自动生成一个异常类对象,该异常对象将被提交给Java运行时系统,这个过程称为抛出(throw)异常。

当Java运行时系统接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获(catch)异常。

如果Java运行时系统找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出。

注意事项

对于RuntimeException,通常不需要我们去捕获,这类异常由Java运行系统自动抛出并自动处理。

如果父类中的方法抛出多个异常,则子类中的覆盖方法要么抛出相同的异常,要么抛出异常的子类,但不能抛出新的异常(注:构造方法除外)。

我们可以在方法声明时,声明一个不会抛出的异常,Java编译器就会强迫方法的使用者对异常进行处理。这种方式通常应用于abstract base class和interface中。

演示代码

]import 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.printStactkTrace();
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//FileNotFoundException
{
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 0;
}
public static void main(String[] args)
{
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);
}
//ArithmeticException是Exception的子类,故要将具体的捕获类型放
//前面,而将通用的捕获类型放后面
catch(Exception e)
{
//打印异常信息的几种方法
//第1种
//System.out.println("can't divide by zero");
//第2种
//System.out.println(e.getMessage());
//第3种
//System.out.println(e.toString());
//第4种
//e.printStackTrace();
}
//不管有没有抛出异常,fianlly里面的语句始终要执行
//finally可用于释放资源,关闭连接等
finally
{
System.out.println("finally");
}
System.out.println("finish");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: