1、异常概述
异常:就是程序运行时出现的不正常情况。
异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式描述,并封装成对象,其实就是java对不正常情况进行描述后的具体体现。
对于问题的划分:两种:一种是严重的问题,一种是非严重的问题。
对于严重的,java通过Error类进行描述。对于非严重的,java通过Exception类进行描述。
对于Error一般不编写针对性的代码对其进行处理。
对于Exception可以通过针对性方式进行处理。
2、Try-catch
异常处理:java提供了特有的语句进行处理;
try
{
需要检测的代码;
}
catch(异常类 变量)
{
处理异常的代码;
}
finally
{
一定会执行的语句;
}
对捕获到的异常对象进行常见方法操作:String getMessage();
e.printStackTrce();其实jvm默认的异常处理机制,就是调用这个方法。
3、异常声明throws
在函数上声明异常,便于提高安全性,让调用者进行处理,不处理编译失败。
4、多异常处理
1.声明异常时,建议声明更为具体的异常,这样处理可以更具体。
2.对方声明几个异常,就应有几个catch块,如果多个catch块的异常出现继承关系,父类异常catch块放在最下面。
建立在进行catch处理时,catch中一定要定义具体处理方式,不要简单定义一句e.printStackTrace();也不要简单的就书写一条输出语句。
5、自定义异常
因为项目中会出现特有的问题,而这些问题并未被java所描述并封装对象,所以这些特有的问题可以按照java的对问题封装的思想,将特有的问题,进行自定义的异常封装。
需求:在本程序中,对于除数是负数,也无法运算,那么就需要对这个问题进行自定义的描述。
class ZiDingYiException extends Exception
{
ZiDingYiException(String msg)
{
super(msg);
}
}
class Test
{
int div(int a,int b)
{
if(b<0)
{
throw new ZiDingYiException();
}
}
}
当在函数内部出现了throw抛出的异常,那么就必须要给对应的处理动作,要么在函数内部try-catch处理,要么在函数声明上让调用者处理。
一般情况下,函数内部出现异常,函数上需要声明。
如何自定义异常信息呢?
因为父类中已经把异常信息的操作都完成了,所以子类只要在构造时,将异常信息传递给父类通过super语句,那么就可以直接通过getMessage方法获取自定义的异常信息。
自定义异常必须是自定义类继承Execption。
为什么要继承Exception?
异常体系有一个特点,因为异常类和异常对象都需要被抛出,他们都具备可抛性,这个可抛性是throwable这个体系独有的特点,只有这个体系的成员才可以被throw和throws抛出。
6、throw和throws的区别
(1)throws使用在函数上,throw使用在函数内。
(2)throws后面跟的是异常类,而throw后面跟的是异常对象。
7、RuntimeException
Exception中有一个特殊的子类异常RuntimeException,运行时异常,如果在函数内部抛出异常,函数上可以不用声明,编译一样通过,如果在函数上声明了对象,调用者可以不用进行异常处理,编译一样通过。
注意:之所以不用在函数上声明,是因为不需要让调用者处理,当该异常发生,希望程序停止,因为程序运行时,出现了无法继续运算的情况,希望停止程序后,对代码进行修正。
8、自定义异常
自定义异常时,如果该异常的发生无法再继续进行运算的话,就让自定义异常继承RuntimeException。
9、异常分两种
1.编译时被检测到的异常
2.编译时不能被检测的异常(运行时异常,RuntimeException及其子类)
10、异常练习
有一个圆形和长方形 都可以获取面积。对于面积如果出现非法的数值,视为是获取面积出现问题。 问题通过异常来表示。 现有对这个程序进行基本设计。
class NoValueExceptiion extends RuntimeException {
NoValueExceptiion(String message) {
super(message);
}
}
interface Shape {
void getArea();
}
class Rec implements Shape {
private int len, wid;
Rec(int len, int wid) // throws NoValueExceptiion
{
if (len < 0 || wid < 0)
throw new NoValueExceptiion("出现非法值");
this.len = len;
this.wid = wid;
}
public void getArea() {
System.out.println(len * wid);
}
}
class Circle implements Shape {
private int r;
public static final double PI=3.14;
Circle(int r) // throws NoValueExceptiion
{
if (r<= 0)
throw new NoValueExceptiion("出现非法值");
this.r = r;
}
public void getArea() {
System.out.println(r*r*PI);
}
}