异常类型的继承关系
1. 所有异常类型的祖先类是Exception类,它有几个常用的函数:
Exception(String msg):构造异常对象,并将其提示信息设定为msg.
String getMessage():返回提示信息,也就是构造函数中设定的msg.
void printStackTrace():将异常跟踪栈信息打印在屏幕上。
用法举例:
try
{FileInputStream fis = new FileInputStream("a.txt");}
catch(IOException e)
{
System.out.println(e.getMessage());
e.printStackTrace();
}
2. Runtime Exception及其子类称为“runtime异常”,其余所有的异常统称为“checked异常”。
try,catch,finally关键字
try
{业务实现块}
catch(异常类型1 e)
{异常处理块1}
catch(异常类型2 e)
{异常处理块2}
...
finally
{资源回收块}
1. catch块和finally块是可选的,但是至少出现其中之一,不能都不出现。
2. 如果在try/catch中执行到退出jvm语句System.exit(1),则会立即终止程序,否则,无论是否出现异常,finally块都一定会被执行。
即使在try/catch中执行到了return/throw,也是转为立即执行finally块。如果在finally块中没有执行到return/throw,才返回来执行try/catch中的return/throw;如果在finally块中执行到了return/throw,则函数立即返回,try/catch中的return/throw根本没机会执行。
throws关键字
1. 如果函数本身不知道该如何处理某个异常,想交给父函数来处理,则可以在函数名后面加“ throws 异常类型1, 异常类型2...”。例如,
public static void test() throws IOException
{FileInputStream fis = new FileInputStream("a.txt");}
2. 主函数同样也可以用throws关键字将异常抛给jvm来处理,jvm处理的方式就是终止程序,打印异常跟踪栈信息。
3. checked异常要么用try...catch捕获,要么用throws捕获,如果都没有的话会编过不去;runtime异常可以不理会,这样它会被自动交给父函数来处理。
throw关键字
可以用“throw 异常对象”语句主动抛出异常。例如,
throw new Exception("a的值不能小于0"); //checked异常
throw new RuntimeException("a的值不能小于0"); //runtime异常
自定义异常类型
通过继承已有的异常类型来实现。例如,
public class MyException extends Exception
{
public MyException(){}
public MyException(String errMsg)
{super(errMsg);}
}