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. 异常处理原理(跟踪 -- 捕获 -- 处理/执行策略)
- Java虚拟机通过方法调用栈(Method invocation stack)来跟踪线程中一系列方法调用过程。【跟踪】
- 在方法执行过程中抛出异常,由Java虚拟机必须能捕获该异常的catch代码块。【捕获】
- 如果当前方法没有该异常的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 异常的主要内容,如果未能解决你的问题,请参考以下文章
Android Java:在 onCreateView() 中返回空视图的片段
java.util.MissingResourceException: Can't find bundle for base name init, locale zh_CN问题的处理(代码片段