异常是指导致程序中断的一种指令流。
一旦产生异常之后,异常后面的语句不会执行,还是停留在异常位置,并且把异常报告给用户。
基本格式:
try{
//要执行的语句
}
catch(){
//抛出异常
}
finally{
//异常的唯一出口
}
例如:
public class ExceptionTest { public static void main(String args[]){ int i = 10; int j =0; try { int temp = i/j; System.out.println(temp); } catch (Exception e) { // TODO: handle exception System.out.println("exception:"+e); }finally{ System.out.println("over"); } } }
异常类的继承结构:
Java的异常结构中 ,两个最常用的类是Exception和Error,这两个类都是Throwable 的子类。
Exception一般表示程序中出现的错误,可以用try...catch来解决;
而error指的是JVM错误,程序中无法处理。
Throwable
类是 Java 语言中所有错误或异常的超类。只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Javathrow
语句抛出。类似地,只有此类或其子类之一才可以是
catch
子句中的参数类型。
处理异常时可以直接用System.out.println()打印异常,也可以用Exception提供的一个方法:public void printStackTrace()
Java中处理异常的过程如下:
*一旦产生异常,则会产生一个异常类的实例化对象。
*在try语句中对该异常进行捕捉
*产生的异常对象与catch语句中各个异常类型进行匹配,如果匹配成功,则执行catch中的代码
*如果最后都没有匹配成功,则程序中断执行(一般少见)
catch中的异常类型可以直接写Exception,根据输出确定,但是最好分别捕获异常。
捕获更粗颗粒的异常语句要放在捕获更细颗粒异常的语句之后,就像漏水,沙子,石块一样,要先漏水,再是沙子,最后是石块。
throws关键字
在定义一个方法的时候可以使用throws关键字来说明,该方法不处理异常,但是调用该方法时,要处理异常。
例如:
class Math{ public int div(int i,int j) throws Exception{ int temp = i/j; return temp; } } public class ExceptionTest { public static void main(String args[]){ int a = 10; int b = 0; Math math = new Math(); try { //必须使用try.catch捕捉异常 System.out.println(math.div(a, b)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
假如主方法上也使用了throws Exception,则主方法也不处理异常,此时处理异常的工具就是JVM。
throw关键字
throw的作用是在程序中抛出一个异常,它抛出的异常是一个异常类的实例化对象。
例如:
public class ExceptionTest { public static void main(String args[]) throws Exception { try { throw new Exception("抛出一个异常"); } catch (Exception e) { // TODO: handle exception System.out.println(e); } } }
一般实际开发中会把throw和throws结合使用。例如要显示所有的程序执行过程,同时也要打印出相关的异常,就要把所有的异常都交给方法调用处处理,
例如:
class Math { public int div(int i, int j) throws Exception { System.out.println("Start"); int temp = 0; try { temp = i / j; } catch (Exception e) { // TODO: handle exception throw e; } finally { System.out.println("Over"); } return temp; } } public class ExceptionTest { public static void main(String args[]) { Math math = new Math(); try { System.out.println(math.div(10, 0)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
使用异常时还可以自定义异常类,创建类继承Exception类即可。
Exception和RuntimeException的区别:
Exception在程序中必须使用try...catch处理;
RuntimeException则可以不使用try...catch处理,如果有异常产生,则交给JVM处理。