异常的定义:
在我们编写代码的时候,经常会出现异常的情况,控制台也会打印出一些报错信息,把这些打印的异常信息称为异常.一句话总结就是,在编写和运行时,程序异常情况,称为异常
异常的体系:
java的设计者们设计了很多异常类,来描述不同的异常情况,如下图就是异常的体系结构
这里展开来介绍:
其中Throwable称为异常的顶级父类(一般情况下不使用),分为两大类:Error和Exception
Error:称为错误,是JDK内部的错误,发生在程序员无法控制的情况,
例如:stackOverflowError[堆栈溢出错误(内存过大)],OutofMemoryError[内存溢出错误],
NoSuchFieldError[字段不匹配],NoSuchMethodError[方法不匹配],illegalAccessError[非法访问]等.
Exception:编译时异常,也称为检查异常,编译前需要处理的异常
例如:IOException[文件输入输出(读写操作)],SQLException[编写SQL数据库语句异常]
运行时异常:编译时不需要处理的异常,在程序运行后处理
例如:NullPointerException[空指针异常],DateTimeException[日期时间异常],
IllegalArgumentException[非法参数异常],IndexOutofBoundException[数组下标越界异常],
UnSupportedOperationException[不支持操作异常等]..
如何处理异常:
1)抛出异常 (throw new 异常类名())
2)捕获异常 (try{} catch(){} finally{})
public static void main(String[] args) {
//捕获异常
try {
// info(0); 1.4
// info(1); 2.4
info(2); //3.4
}catch (NullPointerException e1){
//getMessage异常里面具体信息
System.out.println("2.空指针异常!!" + e1.getMessage());
}catch (IllegalArgumentException e2){
System.out.println("3.非法参数异常!!" + e2.getMessage());
}
finally {
System.out.println("4.最后总要执行!!");
}
}
//抛出异常
public static void info(int i) throws NullPointerException,IllegalArgumentException{
//i == 1 空指针
if (i == 1){
throw new NullPointerException();
}
//i == 2 非法参数
if (i == 2){
throw new IllegalArgumentException();
}
// 其他 正常
System.out.println("1. info 方法调用正常");
}
自定义异常:
在实际开发中,如果企业有自己的问题,相同异常来表示,那么就需要自己来定义异常类
定义的特点: 类名自定义,后缀建议为Exception
自定义类型发生的场景: 编译时/运行时(通常情况下运行时)
1.如果自定义异常类继承Excpetion,则是编译时异常。
特点:方法中抛出的是编译时异常,必须在方法上使用throws声明,强制调用者处理。
2.如果自定义异常类继承RuntimeException,则运行时异常。
特点:方法中抛出的是运行时异常,不需要在方法上用throws声明。
要求: 需要重写对应的构造函数
编译时异常代码如下:
//编译时异常
public class StudentException extends Exception{
public StudentException() {
}
public StudentException(String message) {
super(message);
}
public StudentException(String message, Throwable cause) {
super(message, cause);
}
public StudentException(Throwable cause) {
super(cause);
}
public StudentException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
运行时异常代码如下:
//运行时异常
public class UserException extends RuntimeException{
public UserException() {
}
public UserException(String message) {
super(message);
}
public UserException(String message, Throwable cause) {
super(message, cause);
}
public UserException(Throwable cause) {
super(cause);
}
public UserException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
测试类代码如下:
public class TestCustom {
public static void main(String[] args) {
try {
info(2);
} catch (StudentException e) {
throw new RuntimeException(e);
} finally {
}
}
public static void info(int i) throws StudentException,UserException{
if (i == 1){
throw new StudentException("学生异常");
}
if (i == 2){
throw new UserException("用户异常");
}
//
}
}