Java异常简介

1 异常概念

异常:指程序执行过程中,出现的非正常情况。
注意事项
1.异常并不是语法错误
2.异常本身是一个类,产生异常就是创建了一个异常对象并抛出,Java会做中断处理

2 异常的框架

异常的根类Throwable
其下两个子类分别为Error和Exception。
Error:严重错误,无法通过处理的错误,只能避免。
Exception:异常,可以通过代码修正。
Throwable中有三个方法,方便描述异常的信息,分别为:

public void printStackTrace();//打印异常的详细信息。包含了异常的类型,异常的原因,还包括异常出现的位置,在开发和调试阶段,都得使用printStackTrace。
public String getMessage();//获取发生异常的原因。提示给用户的时候,就提示错误原因。
public String toString();//获取异常的类型和异常描述信息(不用)。

3 异常分类

编译期异常:编译期出现异常,不处理就会编译失败。
运行时异常:运行期检查异常,编译期不检查异常。一般可不处理(交由JVM虚拟机处理)

4 异常处理机制

Java异常的处理机制:抛出异常捕捉异常
抛出异常:当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统。
捕捉异常:在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器,通常最后都会交给JVM处理,中断程序。

5 异常的处理方式

5.1 抛出异常throw

throw关键字用来抛出指定的异常对象,可以是各种类型的异常。
格式

throw new 异常类名(参数);

举例:

throw new NullPointerException("要访问的arr数组不存在");
throw new ArrayIndexOutOfBoundsException("该索引在数组中不存在,已超出范围");
throw new NullPointerException("空指针异常");

注意:对于空指针异常,有着相关的方法:Objects中有个判断对象是否为空的静态方法。其源码为:

public static<T> T requireNonNull(Tob j){
	if(obj==null)
		throw new NullPointerException();
	return obj;
}

5.2 声明异常throws

声明异常:如果方法内通过throw抛出了编译时异常,而没有捕获处理,那么必须通过throws进行声明,让调用者去处理。关键字throws运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(抛出异常).
使用格式

修饰符 返回值 类型方法名(参数) throws 异常类名1,异常类名2{...}

注意事项
如果声明的多个异常具有继承关系,则可只声明父类异常。

5.3 捕获异常try…catch

捕获异常:Java中对异常用try…catch进行捕获,可以对出现的异常进行指定方式的处理。
使用格式

try{
编写可能会出现异常的代码
}catch(异常类型e){
处理异常的代码
//打印异常信息/继续抛出异常
}

5.4 finally代码块

finally:有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到,在finally代码块中存放的代码都是一定会被执行的。
例如如果在try中打开了某些资源,不论是否发生异常,资源都一定要被关闭,这部分代码就可以写在try中。
注意事项:
1.finally代码块需要配合try…catch使用
2.finally代码块中不能有return语句

5.5 多个异常的处理方式

多个异常处理有三种方式:
1.多个异常分别处理。
2.多个异常一次捕获,多次处理。
3.多个异常一次捕获,一次处理。
通常采用一次捕获,多次处理,格式:

try{
编写可能会出现异常的代码
}catch(异常类型 Ae){try中出现A类型异常,就用该catch来捕获.处理异常的代码
//记录日志/打印异常信息/继续抛出异常
}catch(异常类型 Be){try中出现B类型异常,就用该catch来捕获.处理异常的代码
//记录日志/打印异常信息/继续抛出异常
}

注意事项
1.如果多个异常具有继承关系,则子类异常必须写在(catch)父类异常之前。
2.如果父类抛出了多个异常,子类重写父类方法时,抛出和父类相同的异常或者是父类异常的子类或者不抛出异常。
3.父类方法没有抛出异常,子类重写父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出。

6 自定义异常

开发中总存在异常是没有被事先定义好的,所以需要自定义异常。
格式

//有两种方式,分别定义不同性质的异常
public class 异常名 extends Exception {
	构造方法
} //编译期异常
public class 异常名 extends RuntimeException {
	构造方法
} //运行期异常 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值