异常

来源:互联网 发布:算法导论中文版pdf云盘 编辑:程序博客网 时间:2024/05/16 10:53

异常:就是程序在运行时出现不正常情况。

异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述。并封装成对象。
其实就是java对不正常情况进行描述后的对象体现。

对于问题的划分:两种:一种是严重的问题,一种非严重的问题。

对于严重的,java通过Error类进行描述。对于Error一般不编写针对性的代码对其进行处理。

对与非严重的,java通过Exception类进行描述。对于Exception可以使用针对性的处理方式进行处理。

无论Error或者Exception都具有一些共性内容。
比如:不正常情况的信息,引发原因等。
Throwable
|--Error
|--Exception


2,异常的处理

java 提供了特有的语句进行处理。


try
{
需要被检测的代码;
}
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("处理办法:换老师或者放假");}}}


0 0
原创粉丝点击