JavaSE:Java基础2:异常

异常体系

JavaSE:Java基础2:异常

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中的代码块将异常信息输出到日志文件里。