就是报错,就是不处理一下,程序运行到这里就直接终止了,输出报错信息。
但是我们用异常处理,能让他程序不停止不报错。
比如正常1/0程序肯定报错,用异常处理就不报错了。
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/76341582b37a4ebea7c4d6fdf9b6c874.png
处理异常:抛出,捕获。
finally:程序出不出异常都会执行finally里面的内容。
捕获
举例:
异常处理后:
catch里面的参数:想要捕获的异常类型。
最高throwable,捕获了他,他下面所有异常都可以捕获到。
catch可以层层递进:是哪个异常走哪个。
!!!注意:要捕获多个异常,一定从上到下范围从小到大,不然代码会报错。
快捷键
选中要捕获的代码,ctrl+alt+t
打印栈信息:
打印的就是不处理时候的报错内容
源码:
会打印:
抛出
throw, throws
都是用在方法里。
如果是throws,调用方法的地方来处理。
自定义异常
内置的异常可能不够用。但是一般都不需要。
!!异常实现原理(字节码级别)
参考文章:
https://blog.csdn.net/Code_shadow/article/details/81408145?ops_request_misc=&request_id=&biz_id=102&utm_term=%E5%BC%82%E5%B8%B8&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-3-81408145.142v100pc_search_result_base9&spm=1018.2226.3001.4187
从字节码层面上来分析一下Java异常的实现原理,编写如下所示的源代码,使用javac命令进行编译,然后使用javap命令查看编译后的字节码细节内容。
public class ExceptionClassCode {
public int demo() {
int x;
try {
x = 1;
return x;
} catch (Exception e) {
x = 2;
return x;
} finally {
x = 3
}
}
}
public int demo();
descriptor: ()I
flags: ACC_PUBLIC
Code:
stack=1, locals=5, args_size=1
0: iconst_1 // 生成整数1
1: istore_1 // 将生成的整数1赋予第1号局部变量(x=1)
2: iload_1 // 将x(=1)的值入栈
3: istore_2 // 将栈顶的值(=1)赋予第2号变量(returnValue)
4: iconst_3 // 生成整数3
5: istore_1 // x=3
6: iload_2 // returnValue=当前栈顶值(=1)
7: ireturn // 返回returnValue(=1)
8: astore_2 // 将Exception对象引用值赋予第2号局部变量
9: iconst_2 // 生成整数2
10: istore_1 // x=2
11: iload_1 // x(=2)压入栈顶
12: istore_3 // 将栈顶的值(=2)赋予第3号变量(returnValue)
13: iconst_3 // 生成整数3
14: istore_1 // x=3
15: iload_3 // returnValue(=2)压入栈顶
16: ireturn // 返回returnValue(=2)
17: astore 4 // 将异常信息保存到第4号局部变量
19: iconst_3 // 生成整数3
20: istore_1 // x=3
21: aload 4 // 将异常引用值压入栈
23: athrow // 抛出栈顶所引用的异常
Exception table:
from to target type
0 4 8 Class java/lang/Exception # 如果0~4行字节码(try代码块)中出现Exception及其子类异常,则执行第8行(catch代码行)
0 4 17 any # 无论0~4行字节码(try代码块)是否抛出异常,都执行第17行(finally代码行)
8 13 17 any # 无论8~13行字节码(catch代码块)是否抛出异常,都执行第17行(finally代码行)
17 19 17 any
看到字节码中有一个Exception table(异常表)区域,这个就是与异常相关的字节码内容。它表示在from到to所指示的字节码行中,如果抛出type所对应的异常(及其子类),那么就跳到target指定的字节码行开始执行。