异常
异常(Exception)
异常
- 检查性异常
- 运行时异常
- 错误(Error)
异常通过各种意义上可以分为不同的类别,比如分为运行时异常和非运行时异常,也可以分为异常和错误。
Error和Exception的区别:
Error通常是灾难性的致命性的错误,是程序无法处理的,当出现这种异常时,Java虚拟机(JVM)一般会选择终止线程
Exception通常情况下是可以被程序处理的,并且在程序中应该尽可能的去处理这些异常
异常体系结构
Java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类
在Java API很中已经定义了许多异常类,这些异常类又被分为两大类,错误(Error)和异常(Exception)
异常处理机制
异常处理的五个关键字
- try、catch、finally、throw、throws
try、catch、finally的用法
try、catch、finally一般连用,finally可选,try、catch必须存在
注:异常处理的实现机制有点类似选择结构的Switch ,一层层筛选到最后执行(Finally如果存在则一定执行)
源代码
零不能作为除数的异常
public class Test {
public static void main(String[] args) {
int a = 1;
int b = 0;
System.out.println(a / b);
}
}
运行结果
利用try、catch、finally 监控、捕获、处理异常
源代码
public class Test {
public static void main(String[] args) {
int a = 1;
int b = 0;
//假设要捕获多个异常,类要从小到大排列 否则会报错
try {//try 监控区域
System.out.println(a/b);
}catch (Error e){ //catch(捕获想要的异常类型) 捕获异常 这里的形参应该为异常类和对象
System.out.println("Error");
}
catch (Exception e)
{
System.out.println("Exception");
}catch (Throwable t){
System.out.println("Throwable");
}
finally{ //处理善后工作(如果存在则必定执行)
System.out.println("Finally");
}
//finally关键字可选
}
}
运行结果
在idea中,选择代码后,快捷键ctrl+alt+d快捷键可以使代码被...环绕
throw 和 throws 总结
虽然系统没有throw也要把异常抛回给上层调用,但是用户一般习惯于把自己所知的异常用throw抛出,在调用层使用catch来捕获异常,这样相呼应就写成了异常的处理方法。而一般没有写throw的异常基本都是用户预期之外发生的异常。
throws 关键字和 throw 关键字在使用上的几点区别如下:
- throws 用来声明一个方法可能抛出的所有异常信息,表示出现异常的一种可能性,但并不一定会发生这些异常;throw 则是指拋出的一个具体的异常类型,执行 throw 则一定抛出了某种异常对象。
- 通常在一个方法(类)的声明处通过 throws 声明方法(类)可能拋出的异常信息,而在方法(类)内部通过 throw 声明一个具体的异常信息。
throws 通常不用显示地捕获异常,可由系统自动将所有捕获的异常信息抛给上级方法;throw 则需要用户自己捕获相关的异常,而后再对其进行相关包装,最后将包装后的异常信息抛出。
注:经测试 idea编译器严格要求throws抛出异常后,上层需要捕获才能编译通过