java异常处理
-
什么是异常
程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。异常发生时,是任程序自生自灭,立刻退出终止。在Java中即,Java在编译或运行或者运行过程中出现的错误。
Java中异常类可以分为两类:
1、错误(Error):一般指与虚拟机相关的问题,如系统崩溃,虚拟机错误等等,这些错误无法恢复或捕获,将导致应用程序中 断。
2、异常(Exception):因程序编码错误或外在原因导致的问题,这些问题能够被系统捕获并进行处理,从而避免应用程序的非正常中断。
-
通过throws抛出异常
定义一个方法的时候可以使用throws关键字声明抛出一个异常序列。使用throws关键字声明的方法表示此方法不处理异常,而交给方法调用处进行处理。
-
throw关键字抛出异常
throw关键字作用是抛出一个异常,抛出的时候是抛出的是一个异常类的实例化对象,在异常处理中,try语句要捕获的是一个异常对象,那么此异常对象也可以自己抛出。
-
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进行默认处理,则此时会导致程序中断执行。
抛出的示例throws
public static void main(String[] args) throws IOException { InputStream is = new FileInputStream("沉默王二.txt"); int b; while ((b = is.read()) != -1) { } }
捕获的示例try----catch
public static void main(String[] args) { try { InputStream is = new FileInputStream("沉默王二.txt"); int b; while((b = is.read()) != -1) { } } catch (IOException e) { e.printStackTrace(); } }
多异常的处理
-
声明异常时尽可能声明具体异常类型,方便更好的处理;
方法声明几个异常就对应有几个catch块;
若多个catch块中的异常出现继承关系,父类异常catch块放在最后;
在catch语句块使用Exception类作为异常类型时:所有子类实例都可以使用父类接收(向上转型),即所有的异常对象都可以使用Exception接收;
class Demo { int div(int a,int b) throws ArithmeticException,ArrayIndexOutOfBoundsException//在功能上通过throws的关键字声明该功能可能出现问题 { int []arr = new int [a]; System.out.println(arr[4]);//制造的第一处异常 return a/b;//制造的第二处异常 } } class ExceptionDemo { public static void main(String[]args) //throws Exception { Demo d = new Demo(); try { int x = d.div(4,0);//程序运行截图中的三组示例 分别对应此处的三行代码 //int x = d.div(5,0); //int x = d.div(4,1); System.out.println("x="+x); } catch (ArithmeticException e) { System.out.println(e.toString()); } catch (ArrayIndexOutOfBoundsException e) { System.out.println(e.toString()); } catch (Exception e)//父类 写在此处是为了捕捉其他没预料到的异常 只能写在子类异常的代码后面 //不过一般情况下是不写的 { System.out.println(e.toString()); } System.out.println("Over"); } }
-
finally:回收资源
-
try块是必须存在的,catch块和finally块是可选的,但二者必须至少存在一个
-
所有异常类的父类是Throwable