异常体系 Throwable
错误Error
比较严重,依靠代码无法处理,比如内存溢出等。
异常Exception
异常类,程序本身可以处理的问题。异常就是程序出现了不正常的情况。在执行过程中出现的非正常情况,最终导致jvm的非正常停止。
RuntimeException 运行时异常
Java程序在运行时出现的异常。
NullPointerException 空指针异常
空指针异常,又被称为NPE。
为什么会产生npe?原因只有一个,使用了一个null对象的方法。因此定位问题也很简单,注意用了对象.xxx的地方。
解决方式:
- 条件判断是否为空
- try catch语句抛出异常
public static void main(String[] args) {
Object object = null;
//抛出处理异常的方式
//前两者是try-catch抛出异常,更推荐这一种
//
try {
System.out.println(object.toString());
} catch (NullPointerException e){
e.printStackTrace();
System.out.println("发生空值异常");
}
//
try {
System.out.println(object.toString());
} catch (NullPointerException e){
throw e;
}
//条件判断是否为空
if (object == null) {
System.out.println("obje不能为空");
} else {
System.out.println(object.toString());
}
除RuntimeException之外的 编译时异常、检查异常
编译期必须处理的,否则程序不能通过编译。如果在发生运行时异常之前先发生了编译时异常,那么运行时异常不会抛出。
throws 和 throw
throws
throws,抛出一个异常类,用在方法声明之后,表示这个方法在运行过程中可能会产生一个异常,但是方法内部不知道该怎么处理,于是将这个异常抛出,让使用该方法的人去处理,如果一直不处理那么会一直抛出交给jvm处理。可以写很多个异常类在后面,取决于该方法可能会出现多少个异常。
public void show() throws NullPointerException,IllegalArgumentException,ArrayIndexOutOfBoundsException{
throw new NullPointerException("空指针异常");
}
public void ExceptionDemo() throws NullPointerException,IllegalArgumentException,ArrayIndexOutOfBoundsException,IOException{
}
throw
throw 用在方法体内,跟的是异常对象名,表示手动抛出异常对象,由方法体内的语句处理。
public static void main(String[] args) {
try {
FileWriter fileWriter = new FileWriter("x.abc");
} catch (IOException e){
throw new RuntimeException(e);
}
}
try、catch、finally
- 三者只有三种组合形式:try-catch、try-catch-finally、try-finally
- 使用的好处时运行出现异常后将其抛出,程序继续运行不受影响
- 捕获到异常后怎么处理,完全取决于业务逻辑要求
运行逻辑
catch允许同时写很多个,当try里面的代码块出现异常时会根据捕获到的异常的类型到catch里面一个一个对应看与哪一个catch相符合,执行相应的catch,而finally里面的代码块一般情况下表示必须要执行的,且是最后执行。如果有return,那么finally里面的代码是在retur之前执行。如果出现的异常在catch里面找不到,那么这个异常会被继续往上抛,最终会抛给jvm处理,程序停止执行。
如果太多异常不想写那么catch,可以直接捕获所有异常的父类Exception,但是不推荐,无法准确得知出现的是何种异常。不过所有可能的异常被捕获了还有一些未知异常可以使用这个方法。
public class FinallyLogic {
public static void main(String[] args) {
int bb = getAge();
System.out.println(bb);
}
private static int a = 0;
public static int getAge() {
try {
// System.out.println("221");
return aa();
} catch (Exception e) {
} finally {
a = 1;
System.out.println(a + "------------");
return a;
}
}
public static int aa() {
a =