当前位置:网站首页>关于异常处理的知识整理
关于异常处理的知识整理
2022-06-27 19:20:00 【continueLR】
目录
1.什么是异常?
程序在执行过程中不正常的情况称为异常,以类和对象的形势存在,可以通过异常类,创建和实例化异常对象。发生异常时JVM会new异常对象。
Java语言是很完善的语言,提供了异常处理机制,当程序在执行过程中出现异常而终止,java会把异常信息打印输出在控制台,以供参考。
存在的意义:增强java程序的健壮性。
2.异常继承结构
父类:java.lang.Throwable
子类:Error(错误类),Excepition(异常类)
Excepition有两个分支:
一个是异常的直接子类,被称为编译时异常,也叫做受检异常,要求程序员在编写程序的时候必须处理,如果不处理,编译器会报错。
另一个分支是RuntimeException(运行时异常),也叫做非受检异常,在编写程序时,程序员可以选择做预处理,也可以不管,不会影响程序的编译阶段。
3.异常结构继承图

4.关于异常处理的两种方式:
处理异常的第一种方式:
在方法声明的位置上使用throws关键字抛出,谁调用我这个方法,我就抛给谁。抛给调用者来处理。
这种处理异常的态度:上报。
处理异常的第二种方式:
使用try..catch语句对异常进行捕捉。
这个异常不会上报,自己把这个事儿处理了。
异常抛到此处为止,不再上抛了。
注意:
只要异常没有捕捉,采用上报的方式,此方法的后续代码不会执行。
另外需要注意,try语句块中的某一行出现异常,该行后面的代码不会执行。
try..catch捕捉异常之后,后续代码可以执行。
在以后的开发中,处理编译时异常,应该上报还是捕捉呢,怎么选?
如果希望调用者来处理,选择throws上报。
其它情况使用捕捉的方式。
public class ExceptionTest {
// 一般不建议在main方法上使用throws,因为这个异常如果真正的发生了,一定会抛给JVM。JVM只有终止。
// 异常处理机制的作用就是增强程序的健壮性。怎么能做到,异常发生了也不影响程序的执行。所以
// 一般main方法中的异常建议使用try..catch进行捕捉。main就不要继续上抛了。
/*
public static void main(String[] args) throws FileNotFoundException {
System.out.println("main begin");
m1();
System.out.println("main over");
}
*/
public static void main(String[] args) {
// 100 / 0这是算术异常,这个异常是运行时异常,你在编译阶段,可以处理,也可以不处理。编译器不管。
//System.out.println(100 / 0); // 不处理编译器也不管
// 你处理也可以。
/*
try {
System.out.println(100 / 0);
} catch(ArithmeticException e){
System.out.println("算术异常了!!!!");
}
*/
System.out.println("main begin");
try {
// try尝试
m1();
// 以上代码出现异常,直接进入catch语句块中执行。
System.out.println("hello world!");
} catch (FileNotFoundException e){ // catch后面的好像一个方法的形参。
// 这个分支中可以使用e引用,e引用保存的内存地址是那个new出来异常对象的内存地址。
// catch是捕捉异常之后走的分支。
// 在catch分支中干什么?处理异常。
System.out.println("文件不存在,可能路径错误,也可能该文件被删除了!");
System.out.println(e); //java.io.FileNotFoundException: D:\course\01-课\学习方法.txt (系统找不到指定的路径。)
}
// try..catch把异常抓住之后,这里的代码会继续执行。
System.out.println("main over");
}
private static void m1() throws FileNotFoundException {
System.out.println("m1 begin");
m2();
// 以上代码出异常,这里是无法执行的。
System.out.println("m1 over");
}
// 抛别的不行,抛ClassCastException说明你还是没有对FileNotFoundException进行处理
//private static void m2() throws ClassCastException{
// 抛FileNotFoundException的父对象IOException,这样是可以的。因为IOException包括FileNotFoundException
//private static void m2() throws IOException {
// 这样也可以,因为Exception包括所有的异常。
//private static void m2() throws Exception{
// throws后面也可以写多个异常,可以使用逗号隔开。
//private static void m2() throws ClassCastException, FileNotFoundException{
private static void m2() throws FileNotFoundException {
System.out.println("m2 begin");
// 编译器报错原因是:m3()方法声明位置上有:throws FileNotFoundException
// 我们在这里调用m3()没有对异常进行预处理,所以编译报错。
// m3();
m3();
// 以上如果出现异常,这里是无法执行的!
System.out.println("m2 over");
}
private static void m3() throws FileNotFoundException {
// 调用SUN jdk中某个类的构造方法。
// 这个类还没有接触过,后期IO流的时候就知道了。
// 我们只是借助这个类学习一下异常处理机制。
// 创建一个输入流对象,该流指向一个文件。
/*
编译报错的原因是什么?
第一:这里调用了一个构造方法:FileInputStream(String name)
第二:这个构造方法的声明位置上有:throws FileNotFoundException
第三:通过类的继承结构看到:FileNotFoundException父类是IOException,IOException的父类是Exception,
最终得知,FileNotFoundException是编译时异常。
错误原因?编译时异常要求程序员编写程序阶段必须对它进行处理,不处理编译器就报错。
*/
//new FileInputStream("D:\\course\\01-开课\\学习方法.txt");
// 我们采用第一种处理方式:在方法声明的位置上使用throws继续上抛。
// 一个方法体当中的代码出现异常之后,如果上报的话,此方法结束。
new FileInputStream("D:\\course\\01-课\\学习方法.txt");
System.out.println("如果以上代码出异常,这里会执行吗??????????????????不会!!!");
}
}
5.异常对象有两个非常重要的方法
获取异常简单的描述信息:
String msg = exception.getMessage();
打印异常追踪的堆栈信息:
exception.printStackTrace();
public static void main(String[] args) {
// 这里只是为了测试getMessage()方法和printStackTrace()方法。
// 这里只是new了异常对象,但是没有将异常对象抛出。JVM会认为这是一个普通的java对象。
NullPointerException e = new NullPointerException("空指针异常fdsafdsafdsafds");
// 获取异常简单描述信息:这个信息实际上就是构造方法上面String参数。
String msg = e.getMessage(); //空指针异常fdsafdsafdsafds
System.out.println(msg);
// 打印异常堆栈信息
// java后台打印异常堆栈追踪信息的时候,采用了异步线程的方式打印的。
e.printStackTrace();
for(int i = 0; i < 1000; i++){
System.out.println("i = " + i);
}
System.out.println("Hello World!");
}
}边栏推荐
- MySQL performance optimization index function, hidden, prefix, hash index usage (2)
- Safe and efficient, non-contact "hand brushing" identification helps epidemic prevention and control
- 爱数课实验 | 第五期-基于机器学习方法的商品评论情感判定
- MySQL client tools are recommended. I can't imagine that it is best to use Juran
- Educational Codeforces Round 108 (Rated for Div. 2)
- GoLand permanently activated
- Navicat premium connection problem --- host 'XXXXXXXX' is not allowed to connect to this MySQL server
- 如何将队列里面的内容没秒钟执行一次优先级
- Icml2022 | scalable depth Gaussian Markov random field
- Release of global Unicorn list in 2021: the full list of 301 Unicorn enterprises in China is coming!
猜你喜欢
随机推荐
Leetcode 821. Minimum distance of characters (simple) - sequel
Necessary software tools in embedded software development
SQL必需掌握的100个重要知识点:检索数据
Wechat applet based service management system for college party members' Home System applet graduation design, Party members, activists, learning, punch in, forum
强制 20 天内开发 APP 后集体被裁,技术负责人怒批:祝“早日倒闭!”
Leetcode 1381. Design a stack that supports incremental operations
ABC-Teleporter Setting-(思维+最短路)
Icml2022 | scalable depth Gaussian Markov random field
Flutter隐藏AppBar的返回按钮
爱数课实验 | 第五期-基于机器学习方法的商品评论情感判定
原创翻译 | 机器学习模型服务工具对比:KServe,Seldon Core和BentoML
如何将队列里面的内容没秒钟执行一次优先级
抖音的兴趣电商已经碰到流量天花板?
Love math experiment | phase VI - Financial anti fraud case study
Squid proxy server
关于企业数字化的展望(38/100)
Zhongang Mining: the largest application field of new energy or fluorite
VMware vSphere esxi 7.0 installation tutorial
Here are 12 commonly used function formulas for you. All used ones are good
MySQL Express - day 1 - basic introduction









