检测性异常:编译程序的时候会进行检测,如果没有进行处理,不能通过编译。
非检测性异常:编译程序的时候能够通过检测,通常是外部环境(硬盘或者系统故障)等不可检测预见的Error和内部环境(逻辑错误等)的RuntimeException。
三种异常
1:检测性异常(Checked Exception):
一些写的好的程序应该提前考虑到这些异常,这种异常通常出现在写好的程序的内部,应用程序能够提前预测覆盖和捕获这种异常并从中恢复。例如:假设一个应用程序中需要用户输入文件名,然后通过传递这个文件名字到java.io.FileReader类中的构造方法中 打开这个文件,正常情况下,用户提供存在的文件名称,可读性的文件,因此FileReader的对象能够构造成功,这个应用程序能够正常的执行,但是有时用户提供了不存在的用户名称, 这个构造方法会抛出一个FileNotFoundException,一个好的应用程序应该捕获这个异常,通知用户这个错误,有可能提示输入正确的文件名。
检测性异常是Catch or Specify Requirement主题,除了Error , RuntimeException以及它们的子类,所有的其他异常都是检测性异常(Checked Exception)。
2:error
第二种异常是error,这种异常通常出现在应用程序的外部,不能够进行提前预测和从中恢复。例如,假设一个应用程序成功的打开一个文件,但是因为硬盘或者系统故障问题,会出现读取文件不成功将抛出一个java.io.IOError,应用程序可能为了通知用户出现了问题选择捕获这个异常,但是打印一个堆栈信息并退出也许会更有意义。
Errors不是Catch or Specify Requirement的主题,Error是一种异常表示Error和它的子类。
3:运行时异常
第三种异常时运行时异常,这种异常时应用程序的内部的异常,应用程序通常不能够预测和从中恢复。这通常表明程序的bug,例如逻辑错误或者不正确的使用了API等,例如考虑上面的传递文件名到java.io.FileReader类的构造方法中创建对象的FileReader对象的例子,如果因为逻辑错误传递给构造方法一个null,构造方法将抛出一个NullPointException空指针异常,应用程序能够捕获这个异常,但是消除出现异常的这个bug也许更有意义。
运行时异常不是一种Catch or Specify Requirement的主题。运行时异常显示RuntimeException以及它的子类。
Error和runtime exception(运行时异常) 都叫做非检测性异常(unchecked exceptions)。
非检测性异常:编译程序的时候能够通过检测,通常是外部环境(硬盘或者系统故障)等不可检测预见的Error和内部环境(逻辑错误等)的RuntimeException。
三种异常
1:检测性异常(Checked Exception):
一些写的好的程序应该提前考虑到这些异常,这种异常通常出现在写好的程序的内部,应用程序能够提前预测覆盖和捕获这种异常并从中恢复。例如:假设一个应用程序中需要用户输入文件名,然后通过传递这个文件名字到java.io.FileReader类中的构造方法中 打开这个文件,正常情况下,用户提供存在的文件名称,可读性的文件,因此FileReader的对象能够构造成功,这个应用程序能够正常的执行,但是有时用户提供了不存在的用户名称, 这个构造方法会抛出一个FileNotFoundException,一个好的应用程序应该捕获这个异常,通知用户这个错误,有可能提示输入正确的文件名。
检测性异常是Catch or Specify Requirement主题,除了Error , RuntimeException以及它们的子类,所有的其他异常都是检测性异常(Checked Exception)。
2:error
第二种异常是error,这种异常通常出现在应用程序的外部,不能够进行提前预测和从中恢复。例如,假设一个应用程序成功的打开一个文件,但是因为硬盘或者系统故障问题,会出现读取文件不成功将抛出一个java.io.IOError,应用程序可能为了通知用户出现了问题选择捕获这个异常,但是打印一个堆栈信息并退出也许会更有意义。
Errors不是Catch or Specify Requirement的主题,Error是一种异常表示Error和它的子类。
3:运行时异常
第三种异常时运行时异常,这种异常时应用程序的内部的异常,应用程序通常不能够预测和从中恢复。这通常表明程序的bug,例如逻辑错误或者不正确的使用了API等,例如考虑上面的传递文件名到java.io.FileReader类的构造方法中创建对象的FileReader对象的例子,如果因为逻辑错误传递给构造方法一个null,构造方法将抛出一个NullPointException空指针异常,应用程序能够捕获这个异常,但是消除出现异常的这个bug也许更有意义。
运行时异常不是一种Catch or Specify Requirement的主题。运行时异常显示RuntimeException以及它的子类。
Error和runtime exception(运行时异常) 都叫做非检测性异常(unchecked exceptions)。
注意:当try或者catch块在执行的时候,JVM退出了,finally块也许不执行,同样的,如果执行try或者catch块的线程是中断了或者被killed了,即使整个应用程序继续执行,finally块也许不执行。
异常的第一种方式是try catch捕获,第二种方式是抛出异常,抛出异常是由调用这个方法的那个方法对这个异常进行处理,它的处理方式也是有两种,要么捕获,要么继续抛出,继续抛给调用它的方法,就这样一层一层的网上抛。最后,main方法是我们的最后一个方法,如果main方法我们也声明为抛出的方式,那么最后异常就会抛给Java虚拟机了,由虚拟机自己去处理。
package day09;
public class ExceptionDemo {
public static void main(String[] args) {
Demo d = new Demo();
try {// 把有可能抛出异常的代码块写在try块中
int x = d.div(5, -3);
System.out.println(" x= " + x);
} catch (FuShuException e) {// 把有可能抛出异常的代码块写在try块中,一个try可以有多个catch块
System.out.println(e.toString());
System.out.println("这个是针对性的处理。" + e.getNum());
System.out.println(e.getMessage());
} finally {//把清除代码(最后必须执行的代码)放入finally块中是一个很好的选择
}
System.out.println("over");
}
}
class Demo {
int div(int a, int b) throws FuShuException {
if (b < 0)
throw new FuShuException("这个是出现负数作为除数的情况", b);// 抛出一个自定义异常,该异常继承了Exception
return a / b;
}
}
class FuShuException extends Exception {// 自定义异常继承Exception
private int num;
FuShuException(String msg, int num) {
super(msg);
this.num = num;
}
public int getNum() {
return this.num;
}
}