异常
来源:互联网 发布:算法导论中文版pdf云盘 编辑:程序博客网 时间:2024/05/16 10:53
异常:就是程序在运行时出现不正常情况。
异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述。并封装成对象。其实就是java对不正常情况进行描述后的对象体现。
对于问题的划分:两种:一种是严重的问题,一种非严重的问题。
对于严重的,java通过Error类进行描述。对于Error一般不编写针对性的代码对其进行处理。
对与非严重的,java通过Exception类进行描述。对于Exception可以使用针对性的处理方式进行处理。
无论Error或者Exception都具有一些共性内容。
比如:不正常情况的信息,引发原因等。
Throwable
|--Error
|--Exception
2,异常的处理
java 提供了特有的语句进行处理。
{
需要被检测的代码;
}
catch(异常类 变量)
{
处理异常的代码;(处理方式)
}
finally
{
一定会执行的语句;
}
3,对捕获到的异常对象进行常见方法操作。
String getMessage():获取异常信息。
示例:在函数上声明异常
package tan;/*在函数上声明异常。便于提高安全性,让调用者进行处理。不处理编译失败。*/class ChuFa {int div(int a, int b) throws Exception {//在功能上通过throws的关键字声明了该功能有可能会出现问题。return a / b;}}public class ExceptionDemo {public static void main(String[] args) {ChuFa chu=new ChuFa();try {int x=chu.div(4,0);System.out.println("x="+x);} catch (Exception e) {//Exception e = new ArithmeticException(); 美 [əˈrɪθmɪtɪk]算术 System.out.println("除数不能为零!");System.out.println(e.getMessage());//by zeroSystem.out.println(e.toString());//java.lang.ArithmeticException: / by zeroe.printStackTrace();//异常名称,异常信息,异常出现的位置。//其实这就是jvm默认的异常处理机制,就是在调用printStackTrace方法。//打印异常的堆栈的跟踪信息。}System.out.println("程序运行结束!");}}
对多异常的处理
1,声明异常时,建议声明更为具体的异常。这样处理的可以更具体。
2,对方声明几个异常,就对应有几个catch块。不要定义多余的catch块。
如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。*/
建立在进行catch处理时,catch中一定要定义具体处理方式。
不要简单定义一句 e.printStackTrace();也不要简单的就书写一条输出语句。
一般的解决办法是:在catch语句块中将异常信息写在异常信息日志文件中以便于日后查看解决!
package tan;//以下两种异常不可能同时发生,因为函数一旦发生了异常就会抛出,下面的语句不执行class Demo{int div(int a, int b) throws ArithmeticException,ArrayIndexOutOfBoundsException {int[] arr = new int[a];System.out.println(arr[4]);return a / b;}}public class ExceptionDemo2 {public static void main(String[] args) {Demo d=new Demo();try {int x=d.div(4,0);System.out.println("x="+x);}catch(ArithmeticException e){System.out.println("算术异常信息:"+e.toString());System.out.println("被零除啦!!");}catch (ArrayIndexOutOfBoundsException e) {System.out.println("角标越界异常信息:"+e.toString());System.out.println("数组角标越界了!");}System.out.println("程序运行结束!");}}
自定义异常
当在函数内部出现了throw抛出异常对象,那么就必须要给对应的处理动作。
要么在内部try catch处理,要么在函数上声明让调用者处理。一般情况在,函数内出现异常,函数上需要声明。
发现打印的结果中只有异常的名称,却没有异常的信息,因为自定义的异常并未定义信息。
如何定义异常信息呢?
因为父类中已经把异常信息的操作都完成了。
所以子类只要在构造时,将异常信息传递给父类通过super语句。
那么就可以直接通过getMessage方法获取自定义的异常信息。
自定义异常:必须是自定义类继承Exception。
继承Exception原因:
异常体系有一个特点:因为异常类和异常对象都被抛出。
他们都具备可抛性。这个可抛性是Throwable这个体系中独有特点。
只有这个体系中的类和对象才可以被throws和throw操作。
throws和throw的区别
|--throws使用在函数上,后面跟的异常类,可以跟多个,用逗号隔开。
|--throw使用在函数内,后跟的是异常对象
示例:
需求:在本程序中,对于除数是-1(负数),也视为是错误的是无法进行运算的。
那么就需要对这个问题进行自定义的描述。
package tan.tian;class FushuException extends Exception { private int value; //无异常信息FushuException() {super();}/*如何定义异常信息呢?因为父类中已经把异常信息的操作都完成了。所以子类只要在构造时,将异常信息传递给父类通过super语句。那么就可以直接通过getMessage方法获取自定义的异常信息。*/FushuException(String msg,int value){super(msg);this.value=value;}//异常类总自定义的特有的方法public int getValue(){return value;}}class Demo{int div(int a,int b)throws FushuException{if(b<0){throw new FushuException("除数不能为负数",b);//手动通过throw关键字抛出一个自定义异常对象。}return a/b;}}public class ExceptionDmeo3 {public static void main(String[] args) {Demo d=new Demo();try {int x=d.div(4, -2);System.out.println("x="+x);} catch (FushuException e) {System.out.println(e.toString());//e.toString()自动调用getMessage()方法System.out.println("错误的数是:"+e.getValue());}}}/*class Throwable{private String message;Throwable(String message){this.message = message;}public String getMessage(){return message;}}class Exception extends Throwable{Exception(String message){super(message);}}class Person{String name;Person(String name){this.name = name;}public String getName(){return name;}}class Student extends Person{Student (String name){super(name);}}new Sttdent("lisi").getName();*/
Exceptoin中有一个特殊的子类异常RuntimeException 运行时异常。
如果在函数内容抛出该异常,函数上可以不用声明,编译一样通过。
如果在函数上声明了该异常。调用者可以不用进行处理。编译一样通过;
之所以不用在函数声明,是因为不需要让调用者处理。当该异常发生时,希望程序停止。
因为在运行时,出现了无法继续运算的情况,希望停止程序后,对代码进行修正。
自定义异常时:如果该异常的发生,无法在继续进行运算,就让自定义异常继承RuntimeException。
对于异常分两种:
1、编译时被检测的异常。
2、编译时不被检测的异常(运行时异常。RuntimeException以及其子类)
package tan.tian;class TestChu{int div(int a,int b){//throws ArithmeticExceptionif(b==0) throw new ArithmeticException("除数不能为零");return a/b;}}public class ExceptionDemo4 {public static void main(String[] args) {TestChu d=new TestChu();int x=d.div(4, 0);System.out.println("x="+x);}}
练习:
需求描述:毕老师用电脑上课。(名词提炼法)
开始思考上课中出现的问题。
比如问题是:
电脑蓝屏。
电脑冒烟。
要对问题进行描述,封装成对象。
可是当冒烟发生后,出现讲课进度无法继续。
出现了讲师的问题:课时计划无法完成。
package tan.tian;class LanPingException extends Exception{LanPingException(String message){super(message);}}class MaoYanException extends Exception{MaoYanException(String message){super(message);}}class NoPlanException extends Exception{NoPlanException(String msg){super(msg);}}class Computer{private int state = 3;public void run()throws LanPingException,MaoYanException{if(state==2)throw new LanPingException("电脑蓝屏了");if(state==3)throw new MaoYanException("电脑冒烟了");System.out.println("电脑运行");}public void reset(){state = 1;System.out.println("电脑重启");}}class Teacher{private String name;private Computer cmpt;Teacher(String name){this.name = name;cmpt = new Computer();//老师带着电脑来上课,初始化时就生成电脑对象} //定义老师的讲课方法public void prelect()throws NoPlanException{try{ //老师讲课,调用的是电脑的方法cmpt.run();}catch (LanPingException e){cmpt.reset();}catch (MaoYanException e){test();//老师停止讲课,学生做练习//无法处理冒烟异常,故而继续往上抛出无课时计划异常throw new NoPlanException("课时无法继续,原因是"+e.getMessage());}System.out.println("老师讲课");}//学生做练习方法public void test(){System.out.println("学生做练习");}}class ExceptionTest {public static void main(String[] args) {Teacher t = new Teacher("毕老师");try{t.prelect();}catch (NoPlanException e){System.out.println(e.toString());System.out.println("处理办法:换老师或者放假");}}}
- 异常
- 异常!
- 异常
- 异常
- 异常
- 异常
- 异常
- 异常
- 异常
- 异常
- 异常
- 异常
- 异常
- 异常
- 异常
- 异常
- 异常
- 异常
- uva 11404
- Java Web/JavaEE/SSH相关文档在线地址
- DLL 编写与使用
- JAVA 并发小结
- cocos2d-x 3.0 HelloWorld项目创建
- 异常
- 利用shell(dig,expect等命令)对指定的递归器加热解析指定域名
- OPENGL中的矩阵
- ArcGIS教程:创建成本最低路径
- IOS单例模式及单例模式的优缺点
- Domino web应用突然访问慢的问题排查方法
- JAVA中List的一般用法
- 硬盘、文件系统和存储 block、sector、 Stripe size区别
- 最新mac pro垃圾桶mac os系统升级