Java基础专项复习5——异常
Java基础专项复习系列目录
1、Java基础专项复习1——函数关键字static-CSDN博客
2、Java基础专项复习2——集合-CSDN博客
3、Java基础专项复习3——Map集合-CSDN博客
4、Java基础专项复习4——IO流-CSDN博客
文章目录
目录
Java基础专项复习系列目录
文章目录
一、异常概述
异常的体系
错误—Error
异常—Exception
1.1运行时异常
异常的处理
1.1.1 在被调用端来处理运行时异常
1.1.2在调用端来处理运行时异常
1.2编译期的异常
1.3自定义的异常
1.3.1自定义规则
1.3.2自定义的异常使用
一、异常概述
在我们写程序的时候难免会出现错误,java中的异常机制为了提高我们程序的健壮性和容错性而存在。
异常的体系
Throwable类是 Java 中所有错误(Error)和异常(Exception)的超类,位于java.lang包下。它继承自java.lang.Object类,并且实现了Serializable接口。
Throwable类有两个直接已知子类:
Error:用于表示严重的系统错误,这类错误通常是 Java 虚拟机内部的错误,应用程序不应该尝试捕获和处理,比如OutOfMemoryError(内存溢出错误)等。
Exception:用于表示程序运行时可能出现的异常情况,又可以分为受检异常(Checked Exception)和非受检异常(Unchecked Exception)。受检异常要求在方法中使用throws声明或者使用try - catch块进行处理,比如IOException;非受检异常通常是由于编程错误导致的,比如NullPointerException,不需要在方法中显式声明处理。
错误—Error
Error是throwable的子类,他是程序出现了严重的问题,这种问题程序解决不了。
- AnnotationFormatError:当注解的格式不正确时抛出,比如注解的结构不符合 Java 语法规范等情况。
- AssertionError:用于断言失败的情况。在 Java 中,断言是一种调试机制,当使用assert关键字的条件为false时,就会抛出此错误。
- AWTError:与抽象窗口工具包(AWT)相关的严重错误。比如在 AWT 组件初始化或操作过程中遇到系统层面的严重问题时可能会抛出。
- CoderMalfunctionError:涉及编码解码器出现故障时的错误。
- FactoryConfigurationError:与工厂配置相关的错误,例如在创建对象的工厂配置过程中发生严重问题。
- IOError:输入输出操作相关的严重错误,如磁盘故障等导致无法正常进行文件读写等 I/O 操作时可能抛出。
- LinkageError:类加载和链接过程中出现的错误。例如运行时找不到类(NoClassDefFoundError)、链接时出现问题等情况。
- ServiceConfigurationError:服务配置相关的严重错误,比如在配置服务相关参数、加载服务时出现问题。
- ThreadDeath:一个特殊的错误,用于指示线程死亡。通常在线程调用stop方法(已过时,不建议使用)等导致线程终止的情况下相关。
- TransformerFactoryConfigurationError:转换工厂配置错误,比如在配置用于 XML 转换等的工厂类时出现问题。
- VirtualMachineError:Java 虚拟机内部错误。像OutOfMemoryError(内存溢出,虚拟机无法为对象分配足够内存时)、StackOverflowError(栈溢出,方法调用层级过深导致栈空间耗尽时)等都属于此类。
异常—Exception
异常分为两类:
运行时候的异常:可以编译通过,程序在运行期间报出来的异常。
编译期异常:这个异常必须要处理,否则没法编译通过
Exception下面的子类除了RuntimeException以外都是编译期的异常。
RuntimeException下面的所有的子类都是运行时的异常。
1.1运行时异常
异常的自动抛出
抛出运行时异常时候,后面的代码不能正常运行,直接被截断
异常的处理
try......catch
try里面的代码就是有可能产生异常对象的代码
catch(Exception e)用来捕捉到产生的异常对象,catch块就是来处理异常的代码块。e.printStackTrace();打印异常的信息
1.1.1 在被调用端来处理运行时异常
try…catch处理异常的特点:
- try内部发生异常下面的代码不会执行
- 产生的异常对象被catch块里面的参数接收
- catch块来处理异常(如何处理要根据具体的业务要求)
- 如果异常对象被catch来处理就不会向上抛出
- 由于异常对象被处理了,异常后面的代码就会正常的执行
- 调用端不会感知到异常的产生(因为没有向上抛出异常对象),后面的代码正常执行。
1.1.2在调用端来处理运行时异常
try…..finally
1.发生了异常会向上的抛出,但是finally里面的代码永远会得到执行
2.return后面可以通过finally来执行代码
try …..catch …..finally
finally里面适合做方法的资源关闭和收尾的工作
1.2编译期的异常
编译期异常:这个异常必须要处理,否则没法编译通过。
jdk可以准确的预测到这个代码可能发生异常,所以给开发者一个错的警示,让我来处理这种可能发生的异常。
运行时异常向上抛出不需要来声明的编译期的异常如果想要向上抛出就必须要来声明。
编译期的异常建议大家通过try…catch来处理(被调用端处理)
运行时的异常建议向上抛,最顶层来处理。(调用端处理)
1.3自定义的异常
以后项目中会有一些跟业务相关的异常,这种异常我们必须要自定义
1.3.1自定义规则
我们以后的项目中自定义的异常99%都是运行时的异常。我们定义的异常要继承RuntimeException
在类中继承RuntimeException的构造器即可。
public class StockException extends RuntimeException {
public StockException() {
super();
}
public StockException(String message) {
super(message);
}
public StockException(String message, Throwable cause) {
super(message, cause);
}
public StockException(Throwable cause) {
super(cause);
}
protected StockException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
1.3.2自定义的异常使用
我们需要设定主动的抛出异常对象的语法