Java 异常

Posted Naray

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 异常相关的知识,希望对你有一定的参考价值。

一、异常体系分类

异常的基类(超类)是Throwable,throwable有两个子类,分别为:Error、Exception。

Error:指程序中出现无法处理的错误。在出现Error时,JVM虚拟机会选择将出现Error的线程关闭。

Exception:异常,指程序本身可以处理的异常。异常分为:运行时异常和非运行时异常。

运行时异常:程序是可以编译通过的,只有程序执行到异常位置时才出抛出异常。

非运行时异常:程序是编译不通过的。

PS:在开发过程中尽量不要出现运行时异常。Error和Exception是非检查型异常。

检查型异常:经编译器验证。

非检查型异常:编译器是检查不出来的异常,而Error和Exception都是非检查弄异常。

二、异常处理

1. Java异常处理

  • try ... catch .... 语句。
  • finally 语句: 代码块中是否出现异常,都会执行的代码块。任何情况都会执行的代码块。
  • throws 语句:声明可能出现的异常。
  • throw 语句:抛出异常。

2. 异常处理原理(跟踪 -- 捕获 -- 处理/执行策略)

  1. Java虚拟机通过方法调用栈(Method invocation stack)来跟踪线程中一系列方法调用过程。【跟踪】
  2. 在方法执行过程中抛出异常,由Java虚拟机必须能捕获该异常的catch代码块。【捕获】
  3. 如果当前方法没有该异常的catch代码块,Java虚拟机直到追溯到调用栈栈底仍然没有找到该异常处理的catch代码块,当前出现异常是主线程则会打印异常信息;如果是子线程Java虚拟机则会中止该线程执行。【处理/执行策略】

3. 异常流程执行过程 

  哪些情况下不执行catch或finally代码块:

  (1)、finally 语句不被执行唯一情况,在try 代码块中执行System.exit()此语句会退出JVM进程,此时不执行catch代码块;

public void test1() {
    try {
        // TODO: 2020/5/31

        System.exit(0);
    } catch (Exception exec) {
        System.out.println("exception: " + exec);
    } finally {
        System.out.println("End");
    }
}

 

  (2)、在try语句代码块中执行return语句,但是,在return之前先执行finally代码块,return返回分两步:1. 计算return返回值并赋值给未知名的变量;2. return将未知名变量返回;而finally语句在第二前执行;  

public int test2() {
    try {
        // TODO: 2020/5/31

        System.out.println("try start");
        return 0;
    } catch (Exception exec) {
        System.out.println("exception: " + exec);
    } finally {
        System.out.println("End");
    }

    return 0;
}

 

  (3)、不要通过finally语句改变return返回变量的值,在情况2中描述了return返回流程,return 表达式,先执行表达式,再执行finally语句,再执行return返回。通过此方式不能修改返回变量的值。并且不建议这样做。

public int test3() {
    int temp = 10;
    try {
        // TODO: 2020/5/31

        System.out.println("try start");
        return temp;
    } catch (Exception exec) {
        System.out.println("exception: " + exec);
    } finally {
        temp = 100;
        System.out.println("End");
    }

    return temp;
}

 

  (4)、finally语句中不要使用return语句,会导致出现错误,比如:finally语句上的return会覆盖try语句的return;

public int test4() {
    try {
        // TODO: 2020/5/31

        System.out.println("try start");
        return 0;
    } catch (Exception exec) {
        System.out.println("exception: " + exec);
    } finally {
        System.out.println("End");
        return 10;
    }
}

 

以上是关于Java 异常的主要内容,如果未能解决你的问题,请参考以下文章

片段中的 EditText 上的空指针异常 [重复]

Java异常处理机制

片段 getArguments() 空指针异常

Android Java:在 onCreateView() 中返回空视图的片段

java.util.MissingResourceException: Can't find bundle for base name init, locale zh_CN问题的处理(代码片段

使用实体框架迁移时 SQL Server 连接抛出异常 - 添加代码片段