赞
踩
定义:
在程序运行过程中出现的错误,称为异常。异常就是程序运行过程中出现了不正常现象导致程序的中断。
在Java中,把各种异常现象进行了抽象形成了异常类
异常主要分为:错误、非运行时异常(检查异常)、运行时异常(非检查异常)
错误:程序在运行时发生的非人为的难以避免,并且不好解决的特殊情况,最典型的Error的异常是:OutOfMemoryError
非运行时异常:是指程序编写的过程会出现一些安全的隐患,一些异常需要检查,而这些需要检查的异常就是非运行时异常 –也被叫做检查异常
运行时异常:程序员人为性的代码上的错误,这种系统异常可以处理也可以不处理,所以编译器不强制用try…catch处理或用throws声明
运行时异常(非检查异常)不需要预处理,通过规范的代码可以避免产生这种异常
非运行时异常(检查异常)必须预处理,否则编译报错,有三种预处理方式 :
异常的捕获通常使用try和catch来处理,具体格式如下
- try {
-
- }catch(Exception e){
-
- }finally{
-
- }
- try {
- //1、对可能产生异常的代码进行检视
- //2、如果try代码块的某条语句产生了异常, 就立即跳转到catch子句执行, try代码块后面的代码不再执行
- //3、try代码块可能会有多个受检异常需要预处理, 可以通过多个catch子句分别捕获
- } catch (异常类型1 e1) {
- //捕获异常类型1的异常, 进行处理
- } catch (异常类型2 e1) {
- //捕获异常类型2的异常, 进行处理
- //如果捕获的异常类型有继承关系, 应该先捕获子异常再捕获父异常
- } finally {
- //不管是否产生了异常, finally子句总是会执行
- //一般情况下, 会在finally子句中释放系统资源
- }
代码演示
- public void Test1(){
- int i=100;
- int j=0;
- //try里是可能出现异常的代码
- try {
- //当出现被0除异常时,程序流程会执行到“catch(Exception e)”语句,这里是运行是异常,编译可以通过
- //被0除表达式以下的语句永远不会执行
- int c=i/j;
- System.out.println(c);
-
- }catch(Exception e){
- // 当有异常发生的时候,catch块被执行
- //当没有异常发生的时候 catch块就不执行了
- System.out.println("123");
- e.printStackTrace();
- }
- }
测试结果
异常的捕获:一般按照由小到大的顺序,也就是先截获子异常,再截获父异常
将Exception放到前面,会出现编译问题,因为Exception是NullPointerException的父类,所以截获了Exception异常后,Exception的子异常都不会执行到,所以再次截获NullPointerException没有任何意义
正确的顺序:
- try {
- int c=i/j;
- }catch(NullPointerException e){
-
- }catch (Exception e){
-
- }
- }
抛出异常使用的关键字throw,写在方法里,在捕获一个异常前,必须有一段代码先生成异常对象并把它抛出。这个过程我们以手工做,也可以由JRE来实现,但是他们调用的都是throw子句。
具体示例如下
- public void Test1(String pwd){
- if (pwd.length()>=6 && pwd.length()<=18){
- System.out.println("改密码合格");
- }else
- throw new IllegalArgumentException("改密码小于6位或大于18位");
- }
测试结果
声明异常的关键字throws,使用在方法名的后面,用于声明该方法可能会产生一个异常
如果方法声明的是Exception类型的异常或者是非运行时异常,要求方法的调用处必须做处理。
如果声明的是RuntimeException类型的异常,那么方法的调用处可处理可不处理。
父类的方法声明了Exception类型的异常,子类在重写方法时,可以声明也可以不声明。但是如果子类重写后的方法使用super关键字调用父类的方法,那么要求必须对异常进行处理。
如果父类的方法没有异常,那么子类的方法如果一定会有Exception或Checked异常,要求子类必须自己使用try-catch处理,或者给父类方法加上异常的声明
如果子类在重写父类的方法时,产生的异常是RuntimeException异常时,那么可以不用处理
throw
throw 语句用在方法体内,表示抛出异常,由方法体内的语句处理。
throw是具体向外抛出异常的动作,所以它抛出的是一个异常实例,执行throw一定是抛出了某种异常。
throw一般用于抛出自定义异常。
throws
throws语句是用在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常的处理。
throws主要是声明这个方法会抛出某种类型的异常,让它的使用者要知道需要捕获的异常的类型。
throws表示出现异常的一种可能性,并不一定会发生这种异常。
final
用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,被其修饰的类不可继承。
finally
异常处理语句结构的一部分,表示总是执行。
finalize
finalize 是Object 类的一个方法,所以Java对象都有这个方法,当某Java对象没有更多的引用指向的时候,会被垃圾回收器回收,该对象被回收之前,由垃圾回收器来负责调用此方法,通常在该方法中进行回收前的准备工作。该方法更像是一个对象生命周期的临终方法,当该方法被系统调用则代表该对象即将“死亡”,但是需要注意的是,我们主动行为上去调用该方法并不会导致该对象“死亡”,这是一个被动的方法(其实就是回调方法),不需要我们调用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。