异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。常见的三种异常类型有:
- 检查性异常,如打开一个不存在的文件
- 运行时异常,如数组越界
- 错误,如栈溢出
所有的异常类是从 java.lang.Exception 类继承的子类,Exception类是Throwable 类的子类,如下图所示:
常见的非检查性异常有:数组下标越界异常ArrayIndexOutOfBoundsException、空指针异常NullPointerException等,检查性异常有:类未发现异常ClassNotFoundException,表示应用程序试图加载类时,找不到相应的类,NoSuchMethodException表示请求方法不存在等等。
捕获异常,如下实例:
FileInputStream fis = null;
try{
File file = new File("d:\\a.txt");
fis = new FileInputStream(file);
}catch(FileNotFoundException e){
e.printStackTrace();
}finally{
try{
fis.close(); //释放资源
}catch(IOException e){
e.printStackTrace();
}
}
上面实例中使用的捕获异常的方式是:try/catch 代码块,它的最简单的用法为:
try
{
// 程序代码
}catch(ExceptionName e1)
{
//Catch 块
}
当然,也可以使用多重捕获块,即后面有多个catch块,匹配不同的异常,finally块属于可选部分,无论是否发生异常,该代码块总会被执行,这里可用来运行清理类型等收尾善后性质的语句,如资源的释放等。
如果一个方法没有捕获一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。也可以使用 throw 关键字抛出一个异常,仅可应用在方法体中,无论它是新实例化的还是刚捕获到的。用法如下:
//throws用法
public void Fun() throws Exception{
//throw用法
new throw Exception();
}
除了Java中提供的异常类,我们也可以自定义异常类,需要继承Exception类或者Exception的子类。最简单的自定义异常类如下:
public class FunException extends Exception{}
在类中可以提供一个无参构造方法和一个字符串参数的构造方法,方便输出调试信息。