java异常笔记

异常

什么是异常?

导致程序的正常流程被中断的事件,叫做异常

异常的处理

捕获 try catch finlly

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class TestException {

public static void main(String[] args) {

File f= new File("d:/LOL.exe");

try{
System.out.println("试图打开 d:/LOL.exe");
new FileInputStream(f);
System.out.println("成功打开");
}
catch(FileNotFoundException e){
System.out.println("d:/LOL.exe不存在");
e.printStackTrace();
}

}
}

try中放入可能会抛出异常的代码,用catch放入异常的处理代码

父类异常是可以catch到子异常

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class TestException {

public static void main(String[] args) {

File f= new File("d:/LOL.exe");

try{
System.out.println("试图打开 d:/LOL.exe");
new FileInputStream(f);
System.out.println("成功打开");
}

catch(Exception e){
System.out.println("d:/LOL.exe不存在");
e.printStackTrace();
}

}
}

多个异常既可以分开捕获,也可以一起捕获
catch (FileNotFoundException | ParseException e)

无论是否出现异常,finally中的代码都会被执行

抛出

一般是方法抛出异常,由方法的调用者捕获异常

简单来说就是:谁用谁捕获,方法只给出可能抛出的异常

throwsthrow这两个关键字接近,不过意义不一样,有如下区别:

  1. throws 出现在方法声明上,而throw通常都出现在方法体内。
  2. throws 表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某个异常对象。
  3. 两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。

异常的分类

检查型异常 CheckedException

可查异常即必须进行处理的异常,要么try catch住,要么往外抛,谁调用,谁处理,比如 FileNotFoundException

运行时异常 RuntimeException

不是必须进行try catch的异常

错误 Error

指的是系统级别的异常,通常是内存用光了
在默认设置下,一般java程序启动的时候,最大可以使用16m的内存
如例不停的给StringBuffer追加字符,很快就把内存使用光了。抛出OutOfMemoryError
与运行时异常一样,错误也是不要求强制捕捉的

创建自定义异常

1
2
3
4
5
6
7
8
9
class NoGirlFriendException extends Exception {
// 无参构造方法
public NoGirlFriendException() {}

// 有参构造方法
public NoGirlFriendException(String msg) {
super(msg);
}
}