2021-09-17

02.学习笔记 — 异常

1.什么是异常?

程序在执行过程中发生了“不正常的情况”,将这种“不正常的情况”称之为“异常”。

2.异常的分类

在这里插入图片描述

*注解:
1)编译时异常("受检异常"或者"受控异常"):必须在编写程序阶段
   就要对异常进行处理,如果不处理,编译器就会报错。
2)运行时异常("未受检异常"或者"非受控异常"):在编写程序时可
   以选择处理也可以不处理。

3.Java中处理异常的两种方式

1)处理异常的第一种方式:try…catch —— 异常捕获
2)处理异常的第二种方式:throws —— 上抛

一个栗子:

/*
public class ExceptionTest01 {
public static void main(String[] args) {
System.out.println(“main begin”);
//在main方法里对异常进行捕获
try {
m1();
} catch (FileNotFoundException e) {
System.out.println(“文件不存在,可能路径错误,也可能文件被删除了!”);
e.printStackTrace();
}
System.out.println(“main end”);
}
//选择将异常上抛给main()方法
private static void m1() throws FileNotFoundException {
System.out.println(“m1 begin”);
m2();
System.out.println(“m1 end”);
}
//选择将异常上抛给m1()方法
private static void m2() throws FileNotFoundException {
System.out.println(“m2 begin”);
m3();
System.out.println(“m2 end”);
}
//选择将异常上抛给m2()方法
private static void m3() throws FileNotFoundException {
//创建一个输入流对象,该流指向一个文件
//FileNotFoundException是一个编译时异常,父类是IOException
new FileInputStream(“D:\A.我的柠檬水\NEW WORLD\Java源程序”);
}
}
*/

以上代码的执行效果:

在这里插入图片描述

如果在m3中文件的路径一开始就是错的,那么以下代码的执行顺序就会有所改变

public class ExceptionTest01 {
public static void main(String[] args) {
System.out.println(“main begin”);
//在main方法里对异常进行捕获
try {
m1();
//这里的代码不会执行!(因为m1出了异常)
System.out.println(“Hello World!”);
} catch (FileNotFoundException e) {
System.out.println(“文件不存在,可能路径错误,也可能文件被删除了!”);
**/异常对象有两个非常重要的方法:
1)获取异常的简单描述信息:Sting msg = exception.getMessage();
2)打印异常追踪的堆栈信息:exception.printStackTrace();
/

System.out.println(“捕获的异常信息为:”+e.getMessage());
e.printStackTrace();
}
//这里的代码会执行,因为catch已经将异常捕获了。
for(int i = 0;i<5;i++){
System.out.println(“i=”+i);
}
System.out.println(“main end”);
}
//选择将异常上抛给main()方法
private static void m1() throws FileNotFoundException {
System.out.println(“m1 begin”);
m2();
//这里的代码不会执行,因为m2()出了异常
System.out.println(“m1 end”);
}
//选择将异常上抛给m1()方法
private static void m2() throws FileNotFoundException {
System.out.println(“m2 begin”);
m3();
//这里的代码不会执行,因为m3()出了异常
System.out.println(“m2 end”);
}
//选择将异常上抛给m2()方法
private static void m3() throws FileNotFoundException {
//创建一个输入流对象,该流指向一个文件
//FileNotFoundException是一个编译时异常,父类是IOException
new FileInputStream(“D:\A.我的柠檬水\NEW WORLD\Ja序”);
}
}

以上代码的执行效果:

(由于不会长截图,还请见谅。)

!几点说明:

1.选择将异常上抛时,要在方法声明的位置上使用throws关键字;
  使用throws是将异常抛给了”调用者“。
2.一般不要在main()方法上使用throws,因为它会将异常抛给JVM,JVM
  只会终止程序。故在main()方法中选择将异常进行捕获。
3.如果没有将异常进行捕获,而是选择将异常上抛,那么该方法的后续
  代码一定就不会执行了;try语句块中的某一行出现异常,改行后面
  的代码也不会执行;只有将异常捕获之后,后续代码会照常执行。
4.catch后面小括号里中的异常类型可以是具体的异常类型,也可以是
   其父类型;
  catch可以写多个,小括号里的异常类型建议精确到具体类型,一个
  一个的进行处理;按照“从上到下”,异常类型“从小到大”的原则。

4.异常对象的两个重要的方法

1)获取异常的简单描述信息:Sting msg = exception.getMessage();
2)打印异常追踪的堆栈信息:exception.printStackTrace();

5.*关于try…catch中的finally说明

1)fianlly表示“最终地”。finally中的语句块是一定会被执行的!!!
2)try和finally必须联合使用(可以没有catch,但是try和finally必须绑在一起使用!)即使try中的语句块出现了异常,finally中的代码还是会执行!
3)由于finally中的代码比较有保障,因此通常在finally语句块中完成系统资源的释放或者线程池的关闭。
4)如果在try语句块中有return;那么try…finally的执行顺序为:
先执行try…,然后执行finally…,最后执行return;
5)特殊情况:如果在try…catch中执行了System.exit(0)语句,那么就不再执行finally中的代码。System.exit(0)表示退出当前的Java虚拟机,Java虚拟机停止了,任何代码都不再执行了。

6.关于final、fianally、finalize的说明

1)final------关键字
a.final修饰的类不能被继承
b.final修饰的方法不能被覆盖
c.final修饰的修饰的变量不能被重新赋值(是常量)
2)finally------关键字
a.finally中的代码是必须被执行的(有特殊情况)
b.和try联合使用
3)finalize------标识符
a.finalize是Object中的一个方法名
b.finalize方法由垃圾回收器GC负责调用

7.自定义异常

1)为什么需要自定义异常?
因为SUM公司提供的JDK内置的异常不能满足于实际开发的需求,因此程序员可以自定义异常。
2)如何自定义异常?(两步)
a.编写一个类继承Exception或者RuntimeException
b.提供两个构造方法,一个无参的,一个带有String参数的

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值