什么是异常
异常是程序中导致程序中断运行的一种指令流。
如图所示,由红色提示:Exception in thread "main"表示异常发生main线程中,且是因为“by zero”。发生的异常类名为ArithmeticException,就是算术上的异常/错误。控制台Console同时提示我们错误的行数在哪个类的哪个方法的第几行,如这幅图是Exception类的main方法的第九行,这样方便我们找bug。
异常的形成过程(大概了解就行)
至1995年到现在的Java已经积累了很多的异常,如果程序员没有对异常进行try-catch或者throws的处理,系统就会中断整个程序,出现上图的红色的提示。异常是在执行某个函数时引发的,而函数是层级调用,形成了调用栈。如果其中某个函数出了问题,这个发生问题的地方叫做“异常抛出点”,以至于所有调用了这个函数的caller都会相继被异常影响,并输出异常信息,形成异常追踪栈。
引用lulipro博主的一张图片,这种调用回溯的行为叫做异常的冒泡,是为了寻找发生异常时最近的异常处理程序。如第一张图片没有异常处理的程序,最后异常由main抛给了JRE,将程序中断[1]。
异常的分类
异常种类很多,常见的ArithmeticExecption(算术异常)、NullPointerException(空指针异常)、ArrayIndexOutOfBoundsException(数组下标越界)、FileNotFoundException(文件未找到)、ClassCastException(类型强制转换)[2]等。具体的可以打开API帮助文档。
Throwable 是所有错误和异常类的父类。Error是无法用代码进行处理的,我们只能尽量避免**。Exception是程序中的一般错误,是可以用代码进行解决的。**
Exception分为RuntimeException和其他的,即运行时异常和非运行时异常,运行时异常又被称为非受检异常,就如我们第一张图显示的,只有在运行的时候被中断才知道有错误;反之,非运行时异常在Eclipse和Idea等编译器中出现时都会有提示。
处理异常
try-catch
一般类型
关注里面的注释噢~
try{
//可能存在异常的代码行
...
...
}catch(异常类型 实例名e){
//catch后括号例如:catch(IOException e)
//符合以上异常类型会被catch即捕获到要进行的操作
...
}finally{
//必然执行的异常统一处理出口 即不管有无异常,都需要被执行的代码
...
}
try{
//可能存在异常的代码行
...
...
}catch(异常类型 | 另一异常类型 实例e){
//catch后括号例如:catch(IOException e) 或者 catch((ArithmeticException | NullPointerException e)
//符合以上异常类型会被catch即捕获到要进行的操作
...
}finally{
...
}
try{
//可能存在异常的代码行
...
...
}catch(异常类型 实例e){
//catch后括号例如:catch(IOException e)
//符合以上异常类型会被catch即捕获到要进行的操作
...
}catch(异常类型 实例e){
...
}catch(异常类型 实例e){
...
}finally{
...
}
throws
public void setAge(int age) throws IOException{
if(age < 0 || age > 130){
System.out.println("年龄值不符");
}
}
什么时候使用try-catch,什么时候使用throws
一般由于传入的参数不对引起的异常用throws,throws是抛出给调用该方法的函数,由它进行异常处理。
自定义异常类型
public class AgeException extends RuntimeException{
public AgeException(String message) {
super(message);
}
}
欢迎一起交流学习鸭!
[1]https://www.cnblogs.com/lulipro/p/7504267.html
[2]https://blog.csdn.net/it666dhw/article/details/80505889