打开一个不存在的文件、网络连接中断、数组下标越界、正在加载的类文件丢失等都会引发异常。
Java中的异常类定义了程序中遇到的轻微的错误条件。
Java中的错误类定义了程序中不能恢复的严重错误条件。如内存溢出、类文件格式错误等。这一类错误由Java运行系统处理,不需要我们去处理。
Java程序在执行过程中如出现异常,会自动生成一个异常类对象,该异常对象将被提交给Java运行时系统,这个过程称为抛出(throw)异常。
当Java运行时系统接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获(catch)异常。
如果Java运行时系统找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出。
try/catch/finally语句。
对于RuntimeException,通常不需要我们去捕获,这类异常由Java运行系统自动抛出并自动处理。
如果父类中的方法抛出多个异常,则子类中的覆盖方法要么抛出相同的异常,要么抛出异常的子类,但不能抛出新的异常(注:构造方法除外)。
我们可以在方法声明时,声明一个不会抛出的异常,Java编译器就会强迫方法的使用者对异常进行处理。这种方式通常应用于abstract base class和interface中。
import java.io.*;
class Excep
{
Excep() throws ArithmeticException
{
}
public int division(int a,int b) throws ArithmeticException,DivisorIsMinusException//抛出多个异常
//Exception 使用throws (...)Exception编译器会强制要求处理异常,没有处理代码,则报错
{
//try
//{
if(b<0)
throw new DivisorIsMinusException("Divisor can't be minus");//throws是声名,throw是抛出
return a/b;
}
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);//可以不实行finally语句
//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
//不管有没有异常,前面语句是否已经return,只要不要出现exit(非零),finally内的语句都会实行
{
System.out.println("finally");
}
System.out.println("finish");//不管有没有异常,都会实行,如果前面没有return和exit
}
}