文章目录
文章内容:
1. 什么是异常,为什么要处理异常
在写程序的过程中,可能出现各种程序员没有预料到的情况,或者系统存在一些错误,例如打开一些不存在的文件,逻辑错误等,这就叫异常。
为了让用户有一个良好的体验,为了程序的健壮性,不让程序随意崩溃,我们就需要处理异常。
2. 异常语法和执行顺序以及注意事项
- 异常语法
复制代码
try{
//一些会抛出的异常
}catch(Exception e){
//第一个catch
//处理该异常的代码块
}catch(Exception e){
//第二个catch,可以有多个catch
//处理该异常的代码块
}finally{
//最终要执行的代码
}
-
执行顺序
先执行try{},遇到异常后会去匹配catch() 中的异常是否匹配,如果不匹配则执行向下继续catch() ,如果一直没匹配到,就一直执行到finally,然后报错,不再执行后面的代码;如果被对应的catch捕捉到,就先执行该catch() 的内容,然后跳过后面的catch() 直接执行finally的内容,最后接着按正常顺序执行finally{}后面的代码(如果try{}中有return,则在最后执行完finally{}之后不再继续执行后面的代码)。 -
注意事项
(1)在写异常处理的时候,一定要把异常范围小的放在前面,范围大的放在后面,Exception这个异常的根类一定要放在最后一个catch里面,如果放在前面或者中间,任何异常都会和Exception匹配的,就会报 已捕获到…异常的错误
(2)通过 throw new 异常类 的方式抛出异常,后面就不能有可以行代码代码
(3)如果try{}语句块中有return存在,并且程序报错的情况下,在执行完try中语句后,会先执行捕捉到异常的catch语句中的内容,再执行finally内的内容,最后执行return。
(4)有多个catch的情况下,捕捉顺序从上至下依次判断是否是该异常,如果被某个catch捕捉到则执行该catch方法内的代码,之后的catch都不会再执行。
(5)只要程序进入try{}方法中,finally{}之内的代码一定会被执行,不会受catch、try中return的影响。
3. 异常分类
-
异常继承体系
-
异常种类
Exception:表示程序在运行时出现的一些不正常情况,一般大多数表示轻度到中度的问题,属 于可预测、可恢复问题。如除数为 0,数组索引越界等,这种情况下,程序员通过合理的异常处 理,确保程序的正常运行直到结束。
Error:表示代码运行时 JVM(Java 虚拟机)出现的问题。如系统崩溃或内存溢出等,不需要处理 Error。
4. 具体异常(理解记忆)
-
运行时异常 (RuntimeException):
运行时异常(RuntimeException):在程序运行过程中可处理 ,可不处理,父类是 RuntimeException
常见的运行时异常:
InputMismatchException:输入不匹配异常
ArithmeticException:数学计算异常 e.g:除数为 0
IndexOutOfBoundsException:下标/索引越界异常
ArrayIndexOutOfBoundsException : 数组下标越界异常
StringIndexOutOfBoundsException : 字符串下标越界
NullPointerException : 空指针异常
IllegalArgumentException : 方法接收到非法参数
ClassCastException : 强制类型转换异常
NumberFormatException : 数字格式转换异常,如把"abc"转换成数字 -
编译时异常(Exception)
检查时异常(Checked Exception):也称编译时异常,指在编译期间检查程序可能存在不正常 的情况,在程序运行过程中必须处理,否则编译不通过
常见的检查时异常:
ClassNotFoundException : class 没找到异常
FileNotFoundException : 未见未找到异常
IOException:IO 异常
SQLException : 数据库相关异常
UnsupportedEncodingException : 不支持的字符串编码异常 遇到不懂的异常类时,首先要分辨它属于检查时还是运行时异常。
通过快捷键查看 IEDA : ctrl+h
Eclipse: ctrl + t
5. throw和throws关键字区别和作用
- 区别一:
throws:
声明异常,用于声明方法可能存在异常,后面跟的是异常类名
throw:
用在方法体内,后面跟的是异常类对象名
public static void method() throws ArithmeticException { // 跟在方法声明后面,后面跟的是异常类名
int a=1;
int b=0;
if(b==0) {
throw new ArithmeticException(); // 用在方法体内,后面跟的是异常类对象名
}else {
System.out.println(a/b);
}
}
- 区别二:
throws:
可以跟多个异常类名,用逗号隔开
throw:
只能抛出一个异常对象名
public static void method() throws ArithmeticException,Exception {//跟多个异常类名,用逗号隔开
throw new ArithmeticException();// 只能抛出一个异常对象名
}
- 区别三:
throws:
throws:
表示抛出异常,由该方法的调用者来处理
throw:
表示抛出异常,由该方法体内的语句来处理
public class throwandthrows {
public static void main(String[] args) {
try {
method();//由该方法的调用者来处理
}catch (ArithmeticException e) {
e.printStackTrace();
}
}
public static void method() throws ArithmeticException {
int a=1;
int b=0;
if(b==0) {
throw new ArithmeticException();//由该方法体内的语句来处理
}else {
System.out.println(a/b);
}
}
}
- 区别四:
throws:
throws表示有出现异常的可能性,并不一定出现这些异常
throw:
throw则是抛出了异常,执行throw一定出现了某种异常
6. 自定义异常需要注意的地方
-
定义:
(1)首先我们定义的异常类需要继承(运行时异常RuntimeException)或者(编译时异常Exception)中的一个,按自己需求继承
(2)必须提供无参构造方法
(3)必须提供过去参数的构造方法 -
抛出异常
具体案例可以看我下一篇博客:自定义异常类的简单实现 -
声明异常和重写的关系
(1)方法名、参数列表、返回值类型必须和父类相同(方法重写基本要求);
(2)父类中方法没有声明异常,则子类中也不可以声明异常;
(3)父类中方法声明了异常,子类重写后可声明也可不声明,如果声明则必须是与其相同或其异常子类;
(4)子类可以声明比父类更多的异常,但必须小于父类的异常类(即异常子类) - 即子类不能抛出比父类更多、更宽的异常。
总结:
以上就是对异常的总结了,代码仅供参考,我的下一篇博客:自定义异常类的简单实现
参考博文:https://blog.csdn.net/interesting_code/article/details/103306389