参考《第一行代码java》《java程序设计教程》
java中程序的错误有语法错误、语义错误。若是是语法性错误,在编译时就能够检查出来并解决。语义错误是在程序运行时出现的,在编译时没有错误,但在运行时可能会出现错误致使程序退出,这些错误称为异常。在没有异常处理的状况下,也即默认状况下,程序出现异常后会打印异常信息,同时终止执行异常以后的代码。为了让程序在出现异常后仍然能够正常执行完毕,必须引入异常处理语句完善代码。所以,异常处理机制用于检测和处理异常,提升java程序的健壮性。
在java中,全部的异常都当作对象处理,即当发生异常时产生了异常对象。java异常处理机制的语法为:java
try{ //可能出现异常的语句 }catch(异常类型 对象){ //异常处理 }finally{ //不论是否出现异常,仍会统一执行的代码 }
try语句用于捕获可能出现异常的代码。catch语句根据不一样的异常类型进行不一样的异常处理,所以一个try语句能够对应多个catch语句。若是try语句中产生异常,程序会跳转到匹配异常类型的catch语句中,进行异常处理。无论程序是否产生异常,都会执行finally语句。finally语句能够省略。若是省略了finally语句,程序在执行完catch语句后,会继续向下执行。
catch语句和finally语句能够省略,可是不能同时省略。异常格式的组合一般有以下三种:try...catch, try...catch...finally, try...finally。编程
在java中,全部异常类型最高继承类是Throwable。Throwable下面有两个子类Error和Exception。java的异常子类命名都会使用***Error或***Exception的形式,开发者能够根据这个特征进行区分Error和Exception。
Error是JVM错误,属于不可查错误。出现Error时程序因没法处理,没有执行。
Exception是程序运行中的错误,用户可使用异常处理格式处理。异常分为可查异常和不可查异常。
不可查异常是在运行中出现的异常。这类异常在编译中可能出现,也可能不出现,因此在程序中能够选择处理这类异常,或者选择不处理。RuntimeException和其子类属于不可查异常。
可查异常是在编译时被强制检查的异常。这种异常能够预见,所以必须在程序中进行处理,或进行捕获和处理,或抛出给上一级调用方法到处理。不然,编译将没法经过。RuntimeException之外的异常都属于可查异常。数组
ArithmeticException:数学运算异常。
NullPointerException:空指针异常。
NegativeArraySizeException:数组大小为负值异常。
ArrayIndexOutOfBoundException:数组下标越界异常。
NumberFormatException:数字格式异常。
InputMismatchException:输入类型不匹配异常。
NoSuchMethodException:方法不存在异常。
DataFormatException:数据格式错误异常。
NoClassDefFoundError:未找到类定义错误。
OutOfMemoryError:内存不足错误。
StackOverflowError:堆栈溢出错误。
ThreadDeath:线程结束。
UnknownError:未知错误。spa
public Throwable getCause() //返回Throwable对象的缘由。
public String getMessage() //返回Throwable对象的详细信息
public void printStackTrace() //将此Throwable对象的堆栈跟踪输出至错误输出流,做为System.err的值
一、当程序出现异常,JVM自动根据异常的类型实例化一个与之类型匹配的异常类对象。
二、根据异常对象判断是否存在异常处理。若是不存在异常处理,则由JVM对异常默认处理:输出异常信息,结束程序调用。
三、若是存在异常捕获操做,try语句捕获异常类实例化对象,再与catch语句进行异常类型匹配,并处理异常。
四、不论是否匹配到catch语句,若是存在finally语句,就会执行finally语句代码。
五、finally语句后面的代码根据以前是否匹配到catch语句进行处理。若是匹配到catch语句,也即捕获到异常,则继续执行finally后的语句。若是没有匹配到catch语句,则将异常交由JVM默认处理。
异常捕获是一个异常类对象的传递过程,全部异常类对象均可以相父类对象转型。所以能够异常类对象可使用Exception接收,简单实现异常处理。
对于异常分开处理仍是一块儿处理的问题,没有严格的规范,而是根据项目开发标准决定。异常分开处理便于代码的维护,统一处理则能够节省开发精力。
在处理多个异常时,范围小的异常要放在范围大的异常以前处理。不然,范围小的异常会因异常处理完成而没法处理。命令行
throws关键字用在方法的定义上,表示此方法不进行异常的处理,而是交给被调用到处理。线程
myMath.java class myMath{ public static int div(int x, int y) throws Exception{ //该方法不处理异常 return x/y; } } exception_throws.java public class exception_throws{ public static void main(String args[]){ try{ //div()方法抛出异常,这里必须明确处理异常 System.out.println(myMath.div(10,0)); }catch(Exception e){ e.printStackTrace(); } } }
throw关键字用于用户手动抛出一个异常类实例化对象。设计
exception_throw.java public class exception_throw{ public static void main(String args[]){ try{ throw new Exception("self-defined exception"); //直接抛出自定义异常类对象 }catch(Exception e){ e.printStackTrace(); } } }
除在上面提到的三种异常组合格式,还有一种是try...catch...finally结合throw和throws的异常处理格式。指针
class myMath{ public static int div(int x, int y) throws Exception{ //出现异常交给被调用处输出 System.out.println("===start==="); int result = 0; try{ result = x / y; }catch(Exception e){ throw e; //向上抛出 }finally{ System.out.println("===end==="); } return result; } } public class exception_standerd{ public static void main(String args[]){ try{ System.out.println(myMath.div(10,0)); //被调用到处理异常 }catch(Exception e){ e.printStackTrace(); } } }
在本例中,也能够将myMath.java中的catch语句省略。myMath.java中的try语句捕获的异常经过div()方法抛出给调用到处理。code
RuntimeException的子类对象能够根据用户须要进行有选择的处理,程序在编译时不会强制性要求用户处理异常,因此在调用时不处理也不会有任何编译错误。若是没有处理却发生异常,则交给JVM默认处理。
例如Integer类中的parseInt()方法orm
public static int parseInt(String s) throws NumberFormatException;
异常类NumberFormatException属于RuntimeException子类。使用parseInt()时可根据须要处理Runtime子类异常。
public class exception_RuntimeException{ public static void main(String args[]){ int temp = Integer.parseInt("100"); System.out.println(temp); } }
assert在JDK1.4时候引入的,一般用于程序不许备使用捕获异常来处理的错误。其功能是在程序执行到某行后,判断是不是预期的结果。断言的语法格式:
assert 布尔表达式
assert 布尔表达式:字符串表达式
java默认没有开启断言功能。所以程序正式执行时不用去除断言语句。在执行解释java字节码文件时,增长参数“-ea”,开启断言功能。
java -ea exception_assert
public class exception_assert{ public static void main(String args[]){ int num = 10; assert num == 20 : "num isn't 20"; System.out.println("num = " + num); } }
当java提供的异常类型不能知足开发须要时,能够本身开发一个异常类。实现自定义异常类,只须要继承Exception或RuntimeException父类便可。
class AddException extends Exception{ public AddException(String msg){ super(msg); } } public class exception_selfdefine{ public static void main(String args[]){ int num = 20; try{ if(num > 10){ throw new AddException("value is too large!"); } }catch(Exception e){ e.printStackTrace(); } } }
填空
一、 Throwable下有哪两个子类: 。
二、 ArthmeticException类表示 异常,ArraysIndexOutOfBoundsException表示 异常。
三、 一个try代码后面必须跟着若干个 代码段或者一个 代码段。
四、 若是一个方法使用了 ,则编译器会强制在使用此方法时进行异常的处理。
五、 异常处理中使用 做为异常的统一出口。
选择
一、 使用那个关键字能够在程序中手工抛出异常 。
A、 throws B、 throw C、 assert D、 class
二、 下面 关键字能够用在方法的声明处?
A、 throws B、 assert C、 class D、 interface
三、 为了捕获一个异常,代码必须放在下面 语句块中。
A、 try块 B、 catch块 C、 throws块 D、 finally块
四、 下面关于try块的说法正确的是 。
A、 try块后至少应有一个catch块 B、 try块后必须有finally块 C、 可能抛出异常的方法应放在try块中 D、 对抛出的异常的处理应放在try块中
五、 finally块中的代码将 。
A、 老是被执行 B、 若是try块后面没有catch块时,finally块中的代码才会执行 C、 异常发生时才被执行 D、 异常没有发生时才执行
六、 一个异常将终止 。
A、 整个程序 B、 只终止抛出异常的方法 C、 产生异常的try块 D、 上面的说法都不对
七、 全部异常的共同父类是 。
A、 Error B、 Exception C、 Throwable D、 RuntimeException
判断一、 一个try语句后有多个catch时,捕获范围大的异常要放在捕获范围小的异常以后。 ( )二、 finally语句能够根据须要有选择的添加。 ( )简答一、 简述RuntimeException和Exception的区别。二、 try、catch、finally三种语句的功能是什么?三、 简述Java中的异常处理机制。四、 简述Error和Exception的区别。五、 列举三个常见的RuntimeException子类。编程一、 编写应用程序,从命令行输入两个小数参数,求它们的商。要求程序中捕获NumberFormatException异常和ArithmeticException异常。