------- android培训、java培训、期待与您交流! ----------
一、异常概述
异常:就是程序在运行时出现的不正常的情况。
异常的由来:不正常的情况即问题,也是现实生活中的一个具体事务,可以通过面向对象的思想。
通过java的类的形式进行描述。并封装成对象。异常其实就是java对不正常情况进行描述后的对象的体现。
对于异常问题的划分有两种:一种是严重问题,一种是非严重问题。
对于严重的问题:java通过Error类进行描述。对于Error一般不编写针对性的代码对其进行处理。
对于非严重的问题:java通过Exception类进行描述。对于Exception可以用针对性的处理方式对其进行处理。
无论是Error还是Exception都具有一些共性,比如:不正常情况的信息、引发原因。
所以它们有一个父类Throwable。
异常体系:
Throwable 父
|—Error 严重
|—Exception 非严重
|—RuntimeException Runtime异常比较特殊,它与它的子类不会在编译时报异常只在运行期报异常。
异常声明 throws:
在功能上通过throws的关键字声明该功能有可能会出现问题。加了throws关键字后如果不对错误进行预先处理,则编译不通过。
二、异常的处理
异常的处理:java提供了特有的语句进行异常处理
try{
需要被检测代码;
}
catch(异常类 变量)
{
处理方式即处理异常代码;
}
finally
{
一定执行的语句,一般用于释放资源。但是如果在他前面有System.exit(0)的话则执行不到,以为已经退出了虚拟机。
}
异常的处理方式有两种
1,把错误抛出给虚拟机处理
2,自己用try,catch接受异常。自己处理。
处理异常代码例:
处理方式1:抛出错误
class Demo
{
int div(int a, int b)
{
return a/b;//如果这里传入的参数有误系统则会自动产出一个异常对象
}
}
class ExceptionDemo
{
public static void main(String[] args)throws Exception //抛出错误给虚拟机。
{
Demo d = new Demo();
}
}
处理方式2:接收
class ExceptionDemo
{
public static void main(String[] args)
try
{
Demo d = new Demo();
}
catch(Exception e)
{
S.o.p(e.toString); //这里是演示所以简单的写了一个输出语句
}
}
建议在进行catch处理时,catch中一定要定义具体处理方式。
不要简单定义输出语句与printStackTrack();方法(打印异常的堆栈信息)
三、多异常的处理
对多异常处理:
1.声明异常时,建议声明更为具体的异常。这样处理的更具体。
2.对方声明几个异常就对应几个catch块来处理。不要定义多余的catch块。
注意如果多个catch块中的异常出现继承关系,那么父类异常一定要放到最下面。
因为如果放到了最上面那么所有异常都走的是父类异常的处理方式。
多异常处理例:
class Demo
{
int div(int a,int b) throws ArithmeticException,ArrayIndexOutOfBoundsException//在功能上通过throws的关键字声明了该功能有可能会出现问题。
{
int[] arr = new int[a];
System.out.println(arr[4]);
return a/b; //如果这里出现问题就会产生 new () AritchmeticException
//把问题封装成一个对象。该问题已经有描述。所有能创建对象。(已经有父类)。
}
}
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 (ArithmeticException e)//多异常分别catch处理
{
System.out.println(e.toString());
System.out.println("被零除了!!");
}
catch (ArrayIndexOutOfBoundsException e)
{
System.out.println(e.toString());
System.out.println("角标越界了!!");
}
四、自定义异常
因为项目中会出现特有的问题。而这些问题并未能被java所描述并封装对象。所以对于这些特有的问题可以按照java
面向对象的思想。将特有的问题进行自定义的异常封装。
自定义异常:必须是自定义类而且继承了Exception。因为异常体系才具有可抛性,可抛性是Throwable独有的特点。
只有在它的体系中的类与对象才可以被throws与throw操作。
自定义异常:
class FuShuException extends Excepiton
{
private int value;
FuShuExcepitoni(String msg,int value)
{
super(msg);
this.value= value;
}
public int getValue()
{
return value;
}
}
class Demo
{
ind div(int a,int b) throws FuShuException
{
if(b<0||a<0)
throw newFuShuException("出现了负数异常",b);
return a/b;
}
}
class ExceptionDemo2
{
public static void main(String [] args)
{
Demo d = new Demo();
try
{
int x = d.div(-1,3);
}
catch(FuShuException e)
{
S.o.p("出现负数异常"+e.getValue());
}
}
}
五、RuntimeException
Exception类中有一个特殊的子类异常。如果在函数内容抛出该异常。
函数上可以不声明。编译可以通过。如果在函数上声明该异常。
调用者可以不用处理。之所以不用在函数上声明是因为不用调用者处理。
当该异常发生,希望程序停止。因为在运行时,出现了无法继续运行的情况。
希望停止程序后,对代码进行修正。
自定义异常时,如果该异常的发生。无法在继续运行运算。
就让自定义异常类继承RuntimeException
对于异常分两种:
1,编译时被检测的异常:Exception
2,编译时不被检测的异常:RuntimeException及其子类。
六、异常总结
异常:
是什么?是对问题的描述。将问题进行对象的封装。
throw和throws的用法:
throw定义在函数内,用于抛出异常对象。
throws定义在函数上,用于抛出异常类,可以抛出多个用逗号隔开。
异常的注意事项:
在子类覆盖时:
1,子类抛出的异常必须是父亲的异常的子类或者子集。
2,如果父类或者接口没有异常抛出时,子类覆盖出现异常,只能try不能抛。