异常体系:
Throwable
|----Error
·通常出现重大问题如:运行的类不存在或者内存溢出等
·不编写针对代码对其处理。
|----Exception
·在运行是出现一些情况,可以通过try catch finally处理。
Exception和Error的子类名都是以父类作为后缀名,这样方便阅读
异常:就是程序在运行时出现不正常情况。
异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述。并封装成对象。其实就是java对不正常情况进行描述后的对象体现。
对于问题的划分:两种:一种是严重的问题,一种非严重的问题。
对于严重的,java通过Error类进行描述。
对于Error一般不编写针对性的代码对其进行处理。(虚拟机都处理不了了)
对与非严重的,java通过Exception类进行描述。
对于Exception可以使用针对性的处理方式进行处理。
无论Error或者Exception都具有一些共性内容。这个抽取出来的共性内容就是Throwable
比如:不正常情况的信息,引发原因等。
异常的处理
java 提供了特有的语句进行处理。
try
{
需要被检测的代码;
}
catch(异常类 变量)
{
处理异常的代码;(处理方式)
}
finally
{
一定会执行的语句;
}
class Demo
{
int div(int a,int b) throws Exception
{
return a/b;
}
}
class ExceptionDemo
{
public static void main(String[] args)
{
Demo d = new Demo();
try
{
int x = d.div(4,0);
System.out.println("x="+x);
}
catch (Exception e)
{
System.out.println("除零啦");
System.out.println(e.getMessage());
System.out.println(e.toString());
e.printStackTrace();
}
}
异常声明
class Demo
{
int div(int a,int b)throws Exception//在功能上通过throws的关键字声明了该功能有可能会出现问题。
{//声明是开发者提示调用者这个方法有可能出现异常,不抛声明可以编译通过,但是有成运行出现错误。抛声明可以在编译时就提示
return a/b;
}
}
class ExceptionDemo22
{
public static void main(String[] args)//throws Exception。上面抛出声明以后,编译不通过,有两种方式可以解决
{//一种是在调用函数后面继续抛声明,可以像上面一级抛出,直到抛给虚拟机,让虚拟机处理,如果有错误程序就停止
Demo d = new Demo();
try//第二种是自己处理,就try catch函数
{
int x = d.div(4,0);
System.out.println("x="+x);
}
catch (Exception e)
{
System.out.println(e.toString());
}
System.out.println("over");
}
}
对多异常的处理。
1,声明异常时,建议声明更为具体的异常。这样处理的可以更具体。
2,对方声明几个异常,就对应有几个catch块。不要定义多余的catch块。
如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。
建立在进行catch处理时,catch中一定要定义具体处理方式。
不要简单定义一句 e.printStackTrace(),
也不要简单的就书写一条输出语句。
自定义异常
因为项目中会出现特有的问题,而这些问题并未被java所描述并封装对象。所以对于这些特有的问题可以按照java的对问题封装的思想。将特有的问题。进行自定义的异常封装。
需求:在本程序中,对于除数是-1,也视为是错误的是无法进行运算的。
那么就需要对这个问题进行自定义的描述。
当在函数内部出现了throw抛出异常对象,那么就必须要给对应的处理动作。
要么在内部try catch处理。要么在函数上声明让调用者处理。
自定义异常必须是自定义类继承Exception。
继承Exception原因:
异常体系有一个特点:因为异常类和异常对象都被抛出。
他们都具备可抛性。这个可抛性是Throwable这个体系中独有特点。
只有这个体系中的类和对象才可以被throws和throw操作。
class FuShuException extends Exception //自定义一个异常
{
//private String msg;
private int value;
FuShuException (String msg,int value)//建立一个构造函数,FuShuException对象取什么字符串就返回到私有msg上
{
//this.msg = msg;
super(msg);//可以直接调用父类的返回字符串函数
this.value = value;
}
public int getValue()//获取这个值的函数
{
return value;
}
/*
public String getMessage()//建议一个函数,返回msg
{
return msg;
}*/
}
class Demo
{
//一般情况在,函数内出现异常,函数上需要声明。
//如果FuShuException没有继承异常的类,那么当前函数不能抛出到FuShuException。因为在Throwable体系中规定throws和throw使用的对象必须继承异常的类(如Exception何Error)
int div(int a , int b)throws FuShuException
{
if(b<0)
throw new FuShuException("出现了除数是负数的情况",b);//手动通过throw关键字抛出一个自定义异常的对象
return a/b;
}
}
class ExceptionDemo44
{
public static void main(String[] args)
{
Demo d = new Demo();
try
{
int x =d.div(4,-1);
System.out.println("x="+x);
}
catch (FuShuException e)
{
System.out.println(e.toString());
System.out.println("出现负数了,负数是"+e.getValue());
}
}
}