您的位置:首页 > 其它

18 面向对象 异常

2015-06-30 13:47 232 查看
程序会出现两种问题按程度大小分为Error和Exception 我们学的异常就是后者

按照万物皆对象的思想 java将异常及其方法封装成了对象便于我们使用

异常对象实际上就是一种面对程序出现问题的文字提示机制

它并不是直接解决问题只是让程序在会出现问题的地方停止运行并打印出出现的问题的类型敦促程序员处理

实际开发中则是生成日志文件供开发人员分析

我们学习的异常属于Throwable对象中Exception类

异常分为两种:编译时异常(Exception)和运行时异常(RuntimeException)

顾名思义说明了异常发生时程序的状态

注意:RuntimeException会在第一次发现问题的时候退出运行这样以后出现的问题和异常都不会显示所以 如果你只看到1个runtimeException那么不代表这个异常后面就没问题了

比较经典的应用就是如果一个数据的错误会导致以后的问题那么可以使用Runtime异常因为后面再运行已经没有意义了

对于异常处理方式有两种:

抛(throw)

两种抛的位置:一种在方法上throws

一种在语句throw

函数内出现异常函数上需要声明 调用出现异常的方法的方法上也要try或者抛

使用toString方法可以打印异常的名称和信息(需要自定义)

Try(try catch finally)

三者可以组合 finally和catch可以只有其一 也可以都有 但try 是一定要有的

注意:

Try里存放产生问题的代码

Catch表示对异常的处理 你可以空空如也 也算一种处理 但如果你在catch里面throw了 就会报错 因为这不叫处理 叫逃避

如果catch中依然嵌套try catch 无论如何嵌套最里面的catch一定要遵循上述原则

Finally存放总归要运行的代码

三种方法:

在Throwable 里面有三种方法(所有Exception的共性方法)

getMessage() 问题描述

toString() 问题名称+问题描述

printStackTrace() 问题名称+问题描述+问题位置

多异常处理:

出现多个异常就一个try 多个catch就行

可以用多态来预防未声明的Exception类型不过要放在最后

自定义异常:

Java自带的异常类型仅仅是基本类型 在很多时候不够明确 我们可以自己将更具有指向性的提示信息封装在自定义异常的对象中 如果遇到然后弹出效果会更好

要先继承现有异常

再利用三种方法完成自定义异常的细节处理

最后在相应位置完成抛出动作(这里的抛出实际上是生成异常对象的过程)

注意:

实际上 java处理异常的动作是这样的:出现异常辨认异常 如果认识 就采用默认方法 生成异常对象 如果程序使用的是trycatch 那么就交给catch处理 如果抛 那么就抛了

如果不认识那么java自己是不会生成异常对象的因为他不知道应该在哪里生成这只能由我们告诉java 也就是说我们必须自己抛出对象

在覆盖中的体现:

1子类不能出现不属于父类异常体系的异常

也就是说如果父类有异常 子类的异常要么直接就是父类的异常 要么是父类异常的子类

2 子类中的异常只能try 不能抛

如果出现了异常往往说明程序的调试已经到了最后一步

代码:

/*

需求:

要体现:

两种异常

三种处理方式

覆盖

自定义

*/

class ExceptionDemo

{

publicstatic void main(String[] args)

{

try

{

MyRectanglemr = new MyRectangle(4,-5);

mr.getArea();

}

catch(IllegalValueException e1)

{

Show.sop(e1.getMessage("我去"));

e1.printStackTrace();

}

finally

{

Show.sop("长方形面积计算结束");

}

try

{

MyCirclemc = new MyCircle(-4.2);

mc.getArea();

}

catch(IllegalValueException e2)

{

e2.printStackTrace();

}

finally

{

Show.sop("圆形面积计算结束");

}

}

}

class IllegalValueException extendsException //我希望看到两个异常所以没有使用Runtime异常

{

Stringmessage;

publicString getMessage(String message)

{

this.message= message;

returnmessage;

}

IllegalValueException(Stringmessage)

{

super(message); //简单使用父类方法的话 就拿不到getMessage里面的消息了

}

}

interface MyShape

{

abstractvoid getArea();

}

class MyRectangle implements MyShape

{

privatedouble len, wid;

MyRectangle(doublelen, double wid) throws IllegalValueException

{

this.len= len;

this.wid= wid;

if(len<=0 || wid <=0)

{

thrownew IllegalValueException("小样儿");

}

}

publicvoid getArea()

{

Show.sop("您需要的长方形面积是:"+len*wid);

}

}

class MyCircle implements MyShape

{

privatedouble radius;

publicstatic final double PI = 3.1415926; //保护数据

MyCircle(doubleradius) throws IllegalValueException

{

this.radius= radius;

if(radius<=0)

{

thrownew IllegalValueException("小样儿");

}

}

publicvoid getArea()

{

Show.sop("您需要的圆形面积是:"+PI*radius*radius);

}

}

class Show

{

publicstatic void sop(Object obj)

{

System.out.println(obj);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: