码迷,mamicode.com
首页 > 编程语言 > 详细

Java 异常

时间:2020-05-31 16:08:19      阅读:79      评论:0      收藏:0      [点我收藏+]

标签:返回   catch   变量   exe   编译器   追溯   出现   voc   span   

一、异常体系分类

异常的基类(超类)是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 异常

标签:返回   catch   变量   exe   编译器   追溯   出现   voc   span   

原文地址:https://www.cnblogs.com/naray/p/13018922.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!