Java中的异常
Java中的异常
1. 异常机制
当程序出现错误时,程序执行的流程发生改变,程序的控制权转移给异常控制器。
常见的程序错误包括以下三种:
(1)编译时错误:因为语法有误,编译程序能够发现并提示我们错误的位置和原因
(2)运行时错误:运行时产生了不能执行的操作
(3)逻辑错误:程序没有按照预期的逻辑顺序执行
2.异常的结构
在Java中,所有的异常的祖先是Throwable(可抛出)。它有两个重要的子类:Exception和Error,且各自都包含大量子类。异常和错误的区别就是:异常能被程序本身处理,错误是无法处理的。
Error(错误):是程序中无法处理的错误,表示运行应用程序中较严重的问题。通常错误与代码编写者的操作执行无关,而是代码在jvm中运行时出现的问题,比如oom,StackOverflowError(栈溢出错误)虚拟机运行错误。这些异常发生时,jvm通常会选择线程终止,这些错误是不可查的,它们在应用程序的控制和处理能力之外,绝大多数是程序运行时不允许出现的情况。
Exception(异常):是程序本身可以处理的异常,Exception本身有个重要子类叫RuntimeException。RuntimeException 类及其子类表示“JVM 常用操作”引发的错误。例如,若试图使用空值对象引用、除数为零或数组越界,则分别引发运行时异常NullPointerException、ArithmeticException和ArrayIndexOutOfBoundException。
Exception可以分为两大类,运行时异常和非运行时异常
- 运行时异常:都是RuntimeException的子类,常见的包括空指针异常NullPointerException,下标越界异常IndexOutOfBoundsException,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。通常是由程序逻辑错误引起的,这类异常的特点是运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。
- 非运行时异常(编译异常):程序语法上必须进行处理的异常,不处理程序编译就会不通过,是RuntimeException以外的异常,如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。
3.异常处理机制
Java应用程序中,异常处理机制为:抛出异常,捕获异常
Java常见的异常关键字
「try」 – 用于监听。将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就被抛出。
「catch」 – 用于捕获异常。catch用来捕获try语句块中发生的异常。
「finally」 – finally语句块总是会被执行。它主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件)。只有finally块,执行完成之后,才会回来执行try或者catch块中的return或者throw语句,如果finally中使用了return或者throw等终止方法的语句,则就不会跳回执行,直接停止。
「throw」 – 用于抛出异常。
「throws」 – 用在方法签名中,用于声明该方法可能抛出的异常
抛出异常:当一个方法出现错误引发异常时,throw关键字作用是在方法内部抛出一个Throwable类型的异常。任何Java代码都可以通过throw语句抛出异常。
异常的捕获有四种方式:
- try-catch
- try-catch-finally
- try-finally
- try-with-resource