Java 异常
1.Error和Exception:
Error:是程序中无法处理的错误,表示运行应用程序中出现了严重的错误。此类错误一般表示代码运行时JVM出现问题。通常有Virtual MachineError(虚拟机运行错误)、
NoClassDefFoundError(类定义错误)等。比如说当jvm耗完可用内存时,将出现OutOfMemoryError。此类错误发生时,JVM将终止线程。非代码性错误。因此,
当此类错误发生时,应用不应该去处理此类错误。
Exception::程序本身可以捕获并且可以处理的异常。
2.捕获和抛出异常:
Java异常机制用到的几个关键字:try、catch、finally、throw、throws。
- try -- 用于监听。将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就被抛出。
- catch -- 用于捕获异常。catch用来捕获try语句块中发生的异常。
- finally -- finally语句块总是会被执行。它主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件)。只有finally块,执行完成之后,才会回来执行try或者catch块中的return或者throw语句,如果finally中使用了return或者throw等终止方法的语句,则就不会跳回执行,直接停止。
- throw -- 用于抛出异常。
- throws -- 用在方法签名中,用于声明该方法可能抛出的异常。主方法上也可以使用throws抛出。如果在主方法上使用了throws抛出,就表示在主方法里面可以不用强制性进行异常处理,如果出现了异常,就交给JVM进行默认处理,则此时会导致程序中断执行。
异常的父子级:
代码实现:
import org.w3c.dom.Text; public class Demo1{ public static void main(String[] args) { int a = 1; int b = 0; try{ //只要try中的代码出错就会到catch System.out.println(a/b); }catch (ArithmeticException e){//catch(捕获异常的类型) //只要报ArithmeticException的错误就会执行下面的代码 System.out.println("ArithmeticException错误"); }catch (Error e){ //catch可以写多个 System.out.println("未知异常"); }finally { System.out.println("不管报没报错都会执行finally"); } //调用text方法 new Demo1().text(a,b); } //假设这方法中,处理不了这个异常,可以用throws在方法上抛出异常 //throws会将异常抛给调用它的程序 public void text(int a ,int b) throws Error{ if (b==0){ //throw主动抛出异常 一般在方法中使用 throw new ArithmeticException(); } } }
3.自定义异常:
如果要自定义异常类,则扩展Exception类即可,因此这样的自定义异常都属于检查异常(checked exception)。如果要自定义非检查异常,则扩展自RuntimeException。
按照国际惯例,自定义的异常应该总是包含如下的构造函数:
- 一个无参构造函数
- 一个带有String参数的构造函数,并传递给父类的构造函数。
- 一个带有String参数和Throwable参数,并都传递给父类构造函数
- 一个带有Throwable 参数的构造函数,并传递给父类的构造函数。
下面是IOException类的完整源代码,可以借鉴。
public class IOException extends Exception { static final long serialVersionUID = 7818375828146090155L; public IOException() { super(); } public IOException(String message) { super(message); } public IOException(String message, Throwable cause) { super(message, cause); } public IOException(Throwable cause) { super(cause); } }