JavaSE:Java基础2:异常
异常体系
Error(错误):虚拟机本身的错误。错误不能被程序员通过代码处理,Error很少出现。
Exception(异常):程序运行时发送的各种不期望发生的事件。程序本身可以处理,在开发Java程序中进行的异常处理,都是针对Exception类及其子类。日常开发中都是处理Exception。
异常处理方式:1、try...catch和finally 2、throws
第一种处理方式语法格式:
try{
//程序代码块
}catch(ExceptionType (Exception 类及其子类)e){
//对ExceptionType的处理
}
try代码块中编写肯能发生异常的java代码,catch代码块中编写针对异常进行处理的代码。
public class 异常处理方式 {
@Test
public void main() {
try{
//try块中放可能发生异常的代码。
InputStream inputStream = new FileInputStream("a.txt");
//如果执行完try且不发生异常,则接着去执行finally块和finally后面的代码(如果有的话)。
int i = 1/0;
//如果发生异常,则尝试去匹配catch块。
throw new SQLException();
//使用1.8jdk同时捕获多个异常,runtimeexception也可以捕获。只是捕获后虚拟机也无法处理,所以不建议捕获。
}catch(SQLException | IOException | ArrayIndexOutOfBoundsException exception){
System.out.println(exception.getMessage());
//每一个catch块用于捕获并处理一个特定的异常,或者这异常类型的子类。Java7中可以将多个异常声明在一个catch中。
//catch后面的括号定义了异常类型和异常参数。如果异常与之匹配且是最先匹配到的,则虚拟机将使用这个catch块来处理异常。
//在catch块中可以使用这个块的异常参数来获取异常的相关信息。异常参数是这个catch块中的局部变量,其它块不能访问。
//如果当前try块中发生的异常在后续的所有catch中都没捕获到,则先去执行finally,然后到这个函数的外部caller中去匹配异常处理器。
//如果try中没有发生异常,则所有的catch块将被忽略。
}catch(Exception exception){
System.out.println(exception.getMessage());
//...
}finally{
//finally块通常是可选的。
//无论异常是否发生,异常是否匹配被处理,finally都会执行。
//finally主要做一些清理工作,如流的关闭,数据库连接的关闭等。
}
这部分编码解释内容摘自陆少侠hhttps://blog.****.net/a724888/article/details/80114720
throws是另一种处理异常的方式,throws仅仅是将函数中可能出现的异常向调用者声明,自己不具体处理。
采取这种异常处理的原因可能是:方法本身不知道如何处理这样的异常,或者说让调用者处理更好,调用者需要为可能发生的异常负责。
public void foo() throws ExceptionType1 , ExceptionType2 ,ExceptionTypeN
{
//foo内部可以抛出 ExceptionType1 , ExceptionType2 ,ExceptionTypeN 类的异常,或者他们的子类的异常对象。
}
除了上述两种方式,还有一种自定义异常的方式。
使用场景:描述程序中特有的异常情况,毕竟jdk只是对一些通用的异常进行了定义。
java中自定义异常类必须继承自Exception及其子类。
自定义了继承类如何使用,这时候就需要用到throw关键字。throw关键字用于在方法中声明抛出异常的实例对象。
语法格式: throw Exception 异常对象
在方法内使用throw关键字抛出异常对象时,需要使用try...catch语句对抛出的异常进行处理,或者在方法上使用throws关键字声明抛出异常,有该方法的调用者负责处理。
ps:别看一些demo写的都是syso输出到控制台,实际开发都是调用日志框架输出到日志文件中方便分析问题。本人lombok插件用得多,推荐使用@Slf4j
注解(等同于
private static final Logger logger = LoggerFactory.getLogger(this.class);
),然后catch中的代码块将异常信息输出到日志文件里。