黑马程序员——异常
2015-05-21 18:12
295 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
异常(Exception)
出现的问题有很多种,比如角标越界,空指针等都是。就对这些问题进行分类。而且这些问题都有共性内容比如:每一个问题都有名称,同时还有问题描述的信息,问题出现的位置,所以可以不断的向上抽取。形成了异常体系。
Java中定义有java.lang.Throwable类,Exception和Error是其派生的两个子类。
Error:错误,Java虚拟机生成并抛出,如内存溢出,主要出现在编译期,属于语法错误,程序员不可控;
Exception:表示由于网络故障、文件损坏、用户输入非法导致,主要出现在运行期,属于逻辑错误,程序员可控;
NumberFormatException(数字格式化异常):试图将字符串转换成一种数值类型,但不可转换,抛出该异常;
ClassCastException(类型转换异常):强制类型转换不匹配时引发;
ArrayIndexOutOfBoundsException(数组下标越界异常):数组下标越界;
ArithmeticException(数学异常):当出现异常的运算条件时出现此异常;
IOException:发生某种I/O异常时,抛出此异常;
ClassNotException:当应用程序试图使用Class类的forName方法和loadClass方法时,抛出该异常。
声明的原因:是需要调用者对该异常进行处理。
运行时异常如果在函数内被抛出,在函数上不需要声明。
不声明的原因:不需要调用者处理,运行时异常发生,已经无法再让程序继续运行,所以,不让调用处理的,直接让程序停止,由调用者对代码进行修正。
程序执行过程中,try中的代码段可能会抛出一种或击中类型的异常,catch语句分别对发生的异常作相应的处理;若没有异常发生,所有catch代码段都被略过不执行,若catch后还有finally处理语句,则finally块中的代码段一定会被执行。
那么子类的方法只能抛出父类的异常或者该异常的子类。
2,如果父类抛出多个异常,那么子类只能抛出父类异常的子集。
简单说:子类覆盖父类只能抛出父类的异常或者子类或者子集。
注意:如果父类的方法没有抛出异常,那么子类覆盖时绝对不能抛,就只能try
当异常不在方法中处理时,用throws将异常抛出,由其他方法统一处理。
对于除法运算,0作为除数是不可以的。java中对这种问题用ArithmeticException类进行描述。对于这个功能,在我们项目中,除数除了不可以为0外,还不可以为负数。可是负数的部分java并没有针对描述。所以我们就需要自定义这个异常。
定义异常处理时,什么时候定义try,什么时候定义throws呢?
功能内部如果出现异常,如果内部可以处理,就用try;
如果功能内部处理不了,就必须声明出来,让调用者处理。
自定义异常的步骤:
(1)定义一个子类继承Exception或RuntimeException,让该类具备可抛性。
(2)通过throw 或者throws进行操作。
自定义示例:
------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培训、期待与您交流! -------
相关文章推荐
- 黑马程序员——异常
- 黑马程序员——45,内部类,多态,异常
- 黑马程序员——javase基础--多态、内部类、异常
- 黑马程序员--异常
- 黑马程序员——异常
- 黑马程序员——java基础之异常
- 黑马程序员_异常
- 黑马程序员----继承3(内部类、异常、包)
- 黑马程序员——异常
- 黑马程序员---内部类以及异常的使用
- 黑马程序员-------关于异常
- 黑马程序员—Java基础---异常体系学习总结
- 黑马程序员_05 java异常处理总结
- 黑马程序员—java基础之异常总结
- 黑马程序员--java基础--异常(一)
- 黑马程序员--数组,索引器与集合(泛型) 异常(07)
- 黑马程序员---------笔记整理(java基础六-----异常)
- 黑马程序员——【Java基础】——面向对象(二)异常机制、包(Package)
- 黑马程序员 Java面向对象——异常
- 黑马程序员——浅析异常