黑马程序员——异常

来源:互联网 发布:手机怎么注销淘宝账号 编辑:程序博客网 时间:2024/06/08 19:16

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

 

异常(Exception)

1、什么是异常

        异常:就是不正常。程序在运行时出现的不正常情况。其实就是程序中出现的问题。这个问题按照面向对象思想进行描述,并封装成了对象。因为问题的产生有产生的原因、有问题的名称、有问题的描述等多个属性信息存在。当出现多属性信息最方便的方式就是将这些信息进行封装。异常就是java按照面向对象的思想将问题进行对象封装。这样就方便于操作问题以及处理问题。

         出现的问题有很多种,比如角标越界,空指针等都是。就对这些问题进行分类。而且这些问题都有共性内容比如:每一个问题都有名称,同时还有问题描述的信息,问题出现的位置,所以可以不断的向上抽取。形成了异常体系。

2、异常分类

异常分为两类:运行时异常(/非检查异常)和非运行时异常(/检查异常);

Java中定义有java.lang.Throwable类,Exception和Error是其派生的两个子类。

Error:错误,Java虚拟机生成并抛出,如内存溢出,主要出现在编译期,属于语法错误,程序员不可控;

Exception:表示由于网络故障、文件损坏、用户输入非法导致,主要出现在运行期,属于逻辑错误,程序员可控;

2.1 常见运行时异常:

NullPointerException(空指针异常):当操作一个空引用时引发此异常;

NumberFormatException(数字格式化异常):试图将字符串转换成一种数值类型,但不可转换,抛出该异常;

ClassCastException(类型转换异常):强制类型转换不匹配时引发;

ArrayIndexOutOfBoundsException(数组下标越界异常):数组下标越界;

ArithmeticException(数学异常):当出现异常的运算条件时出现此异常;

2.2 常见非运行时异常:

SQLException:提供关于数据库访问错误的异常;

IOException:发生某种I/O异常时,抛出此异常;

ClassNotException:当应用程序试图使用Class类的forName方法和loadClass方法时,抛出该异常。

2.3 运行时异常(/非检查异常)和非运行时异常(/检查异常)区别:

编译被检查的异常在函数内被抛出,函数必须要声明,否编译失败。

声明的原因:是需要调用者对该异常进行处理。

运行时异常如果在函数内被抛出,在函数上不需要声明。

不声明的原因:不需要调用者处理,运行时异常发生,已经无法再让程序继续运行,所以,不让调用处理的,直接让程序停止,由调用者对代码进行修正。 

3、异常处理机制

当程序抛出一个异常后,程序从程序中导致异常的代码处跳出,Java虚拟机检测寻找和try关键字匹配的处理该异常的catch块,若找到,将控制权交与处理异常的catch块,在所有finally块代码被执行和当前线程所属的ThreadGroup的uncaughTException方法被调用后,遇到异常的当前线程被中止。

4、异常的捕获处理

4.1 格式一

格式一:try { // 可能发生异常的代码段 } catch (Exception e) { // 异常处理代码段 } finally { // 最终执行的代码段 } 

程序执行过程中,try中的代码段可能会抛出一种或击中类型的异常,catch语句分别对发生的异常作相应的处理;若没有异常发生,所有catch代码段都被略过不执行,若catch后还有finally处理语句,则finally块中的代码段一定会被执行。

 

4.2 格式二

try {// 可能发生异常的代码段 } catch (NullPointerException e /* 子类异常 */) { // 空指针异常处理代码段 } catch (RuntimeException e /* 父类异常 */) { // 运行时异常处理代码段 } catch (Exception e /* 最终捕获Exception */) { // 异常处理代码段 } finally { // 最终执行的代码段 }

4.3 异常的注意事项:

1,子类在覆盖父类方法时,父类的方法如果抛出了异常,
那么子类的方法只能抛出父类的异常或者该异常的子类。

2,如果父类抛出多个异常,那么子类只能抛出父类异常的子集。

简单说:子类覆盖父类只能抛出父类的异常或者子类或者子集。

注意:如果父类的方法没有抛出异常,那么子类覆盖时绝对不能抛,就只能try

 

4.4 finally:

finally语句为异常处理提供一个统一的出口,对程序状态作统一管理,无论try所指定的程序块中是否抛出异常,finally中的代码段都要被执行,通常在finally语句中进行资源释放。

4.5 异常的三种组合方式:

方式一

方式二

方式三

try

catch

finally

 

try

catch

 

try

finally

 

 

5 、throw和throws

throw用于自行抛出异常,需指定异常对象,异常不在当前代码段中处理,通常程序中出现非语法错误,不满足业务逻辑时使用;

当异常不在方法中处理时,用throws将异常抛出,由其他方法统一处理。 

6、异常方法

 

编号

方法

说明

1

Throwable  getCase()

检索异常出现的原因

2

String  getMessage()

返回异常消息的字符串表示

3

StackRraceElement  printStackTrace()

跟踪异常发生时执行堆栈的内容

4

String  toString()

返回异常的文本描述

 

7 、自定义异常

自定义异常:当开发时,项目中出现了java中没有定义过的问题时,这时就需要我们按照java异常建立思想,将项目的中的特有问题也进行对象的封装。这个异常,称为自定义异常。

 

对于除法运算,0作为除数是不可以的。java中对这种问题用ArithmeticException类进行描述。对于这个功能,在我们项目中,除数除了不可以为0外,还不可以为负数。可是负数的部分java并没有针对描述。所以我们就需要自定义这个异常。

定义异常处理时,什么时候定义try,什么时候定义throws呢?

功能内部如果出现异常,如果内部可以处理,就用try;

如果功能内部处理不了,就必须声明出来,让调用者处理。

 

自定义异常的步骤:

(1)定义一个子类继承Exception或RuntimeException,让该类具备可抛性。

(2)通过throw 或者throws进行操作。

 自定义示例:

/* 毕老师用电脑上课。 问题领域中涉及两个对象。 毕老师,电脑。 分析其中的问题。 比如电脑蓝屏啦。冒烟啦。 */class LanPingException extends Exception {LanPingException(String msg) {super(msg);}}class MaoYanException extends Exception {MaoYanException(String msg) {super(msg);}}class NoPlanException extends Exception {NoPlanException(String msg) {super(msg);}}class Computer {private int state = 2;public void run() throws LanPingException, MaoYanException {if (state == 1)throw new LanPingException("电脑蓝屏啦!!");if (state == 2)throw new MaoYanException("电脑冒烟啦!!");System.out.println("电脑运行");}public void reset() {state = 0;System.out.println("电脑重启");}}


 

 

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

0 0
原创粉丝点击