Java异常处理需要掌握的知识点:

目录

一、异常的概念

二、异常分类

三、异常处理的机制java异常处理的方式

四、异常处理的原则(这部分还有点疑问,没有找到明确的原则)


一、异常的概念

什么是异常?
        程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。在Java中即,Java在编译或运行或者运行过程中出现的错误。

Java提供了更加优秀的解决办法:异常处理机制。

异常处理机制能让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性地处理异常,让程序尽最大可能恢复正常并继续执行。也是一种容错机制。
 

二、异常分类

java 容错框架 java容错纠错机制_Java

三、异常处理的机制java异常处理的方式

 JVM 是如何处理异常的?
        在一个方法中如果发生异常,这个方法会创建一个异常对象,并转交给 JVM,该异常对象包含异常名称,异常描述以及异常发生时应用程序的状态。创建异常对象并转交给 JVM 的过程称为抛出异常。可能有一系列的方法调用,最终才进入抛出异常的方法,这一系列方法调用的有序列表叫做调用栈。

        JVM 会顺着调用栈去查找看是否有可以处理异常的代码,如果有,则调用异常处理代码。当 JVM 发现可以处理异常的代码时,会把发生的异常传递给它。如果 JVM 没有找到可以处理该异常的代码块,JVM 就会将该异常转交给默认的异常处理器(默认处理器为 JVM 的一部分),默认异常处理器打印出异常信息并终止应用程序。

方式一: 捕获异常try-catch-finally
方式二:直接抛出异常throw

通常,应该捕获那些知道如何处理的异常,将不知道如何处理的异常继续传递下去。传递异常可以在方法签名处使用 throws 关键字声明可能会抛出的异常。

private static void readFile(String filePath) throws IOException {
    File file = new File(filePath);
    String result;
    BufferedReader reader = new BufferedReader(new FileReader(file));
    while((result = reader.readLine())!=null) {
        System.out.println(result);
    }
    reader.close();
}

 方式三: 声明异常throws

封装异常再抛出
有时我们会从 catch 中抛出一个异常,目的是为了改变异常的类型。多用于在多系统集成时,当某个子系统故障,异常类型可能有多种,可以用统一的异常类型向外暴露,不需暴露太多内部异常细节。

private static void readFile(String filePath) throws MyException {    
    try {
        // code
    } catch (IOException e) {
        MyException ex = new MyException("read file failed.");
        ex.initCause(e);
        throw ex;
    }
}

java 容错框架 java容错纠错机制_java 容错框架_02

四、异常处理的原则(这部分还有点疑问,没有找到明确的原则)

 异常处理的一般原则:

(1)具体明确:

异常类有很多,异常捕获越具体,我们的程序就能更好地回答”什么出了错”这个问题。捕获异常时尽量明确很重要。

  • 1.保持异常的原则性,异常的原子性是指异常发生后,各个对象的状态可以回复到异常发生前的状态,而不会处于某个不合理的中间态
  • 2.避免过大的try代码块,try代码块越大,出现的异常的地方越多,要分析发生一场的地方就越困难,有效的做法是分割各个可能出现异常的程序段落,把它们分别放在单独的try语句中,从而分别捕获异常
    3.在catch语句中声明具体的异常类型,从小到

(2)提早抛出:

        能处理就早处理,抛出还不能处理的就想法消化掉或者转换为RuntimeException处理。因为对于一个应用系统来说,抛出大量异常是有问题 的,应该从程序开发角度尽可能的控制异常发生的可能。

        异常堆栈信息提供了导致异常出现的方法调用链的精确顺序,包括每个方法调用的类名,方法名,代码文件名甚至行数,以此来精确定位异常出现的现场。通过提早抛出异常(又称"迅速失败"),异常得以清晰又准确。

(3)延迟捕获:

        把异常处理的责任往调用链的上游传递的办法,就是在方法的throws子句声明异常。在声明可能抛出的异常时,注意越具体越好。这用于标识出调用你方法的程序需要知晓并且准备处理的异常类型。

(4) 对于一个应用系统来说,应该有自己的一套异常处理框架,这样当异常发生时,也能得到统一的处理风格,将优雅的异常信息反馈给用户。