zoukankan      html  css  js  c++  java
  • 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;
        }
    }
  • 相关阅读:
    更改开机密码导致的sql服务启动失败!
    读书:我编程我快乐(一.3)
    读书:我编程我快乐(一.4)
    C#中刷新页面的方式
    VSS 2005 安装,配置简明手册 及VSS2005下载地址
    VSS2005使用手册
    让你少奋斗10年的工作经验
    Tomcat jdk配置及内存设置
    常用的正则表达式
    HTTP Status 403 Access to the requested resource has been denied
  • 原文地址:https://www.cnblogs.com/naray/p/13018922.html
Copyright © 2011-2022 走看看