点击打开链接 点击打开链接 点击打开链接 android培训、<a">点击打开链接 点击打开链接 java培训、期待与您交流!">点击打开链接 点击打开链接
异常
异常的体系
Throwable
Error
通常出现重大问题如:运行的类不存在或者内存溢出等
不编写针对代码对其处理
Exception
在运行时运行出现异常的情况,可以通过try catch finally进行处理
Exception和Error的子类名都是以父类名作为后缀。
异常就是运行时出现不正常情况
异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述,并封装成对象。其实就是java对不正常情况进行描述后的对象体现
对问题划分
一种是严重的问题:java通过Error类进行描述,对于Error一般不编写针对性代码进行处理
一种是非严重的问题:java通过Exception类进行描述,对于Exception可以使用针对性处理方式进行处理。
异常的处理
try
{
需要被检测的代码;
}
catch (异常类 变量)
{
处理异常的代码;
}
finally
{
一定会执行的语句;只有System.exit(0)不会执行。
}
对捕获到的异常对象进行常见方法操作
string getMessage():获取异常信息
string toString() 异常名称:异常信息
void printstackTrace() 异常名称:异常信息,异常出现的位置
Throwable fillInStackTrace() 在异常堆栈跟踪中填充
Throwable getCause() 返回此Throwable的cause,如果不存在或未知,则返回null。
其实JVM默认的异常机制就是在调用printStackTrace方法,打印异常的堆栈的跟踪信息。
int div(int a,intb) throws Exception 在功能上通过throws的关键字声明了该功能有可能出现的问题。
在函数上申明异常:便于提高安全性,让调用出进行处理,不处理则编译失败。
对多异常的处理
1.声明异常时,建议声明更为具体的异常,这样处理可以更为具体
2.对方声明几个异常,就对应有几个catch块,如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。
3.建议在进行catch处理时,catch中一定要定义具体处理方式,不要简单定义一句e.printStackTrace().
自定义异常:
对特有的问题可以按照java的对问题封装的思想,将特有的问题进行自定义的异常封装。
当在函数内部出现了throw抛出异常对象,那么就必须要给出对应的处理动作。
要么在内部try catch 处理
要么在函数上申明让调用者处理
一般情况,在函数内出现异常,函数上需要声明
如何定义异常信息
因为父类中已经把异常的操作都完成了,所以子类只要在构造时,将异常信息传递给父类,通过super语句,那么就可以直接通过getMessage()获取异常信息。
自定义异常:必须是自定义类继承Exception
原因:异常体系有一个特点,异常类和对象都被抛出,他们都具备可抛性,可抛性是Throwable这个体系独有的特点,只有这个体系中的类和对象才可以被throw和throws操作。
Test7
class Test7
{
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.getMessage());
System.out.println(e.getValue());
}
}
}
//自定义异常类必须继承Exception
class FushuException extends Exception
{
private int value;
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;
}
}
throw和throws的区别
throws使用在函数上,throw使用在函数内
throws后跟的是异常类,可以跟多个,用,隔开;throw后跟的是异常对象。
RuntimeException 运行时异常
如果在函数内抛出该异常,函数上可以不用声明,编译一样通过
如果在函数上声明了该异常,调用者可以不用处理,编译一样通过。
之所以不用在函数上声明,是因为不需要让调用者处理。当该异常发生,希望程序停止。因为在运行时,出现了无法继续运行的情况,希望程序停止,对代码进行修正。
自定义异常时,如果该异常的发生,无法继续进行运算,就让自定义异常继承RunTimeException。
异常:编译时被检测异常
编译时不被检测的异常(运行时异常,RunTimeException及其子类)
finally中存放的是一定会被执行的语句。
finally 代码块:定义一定执行的代码,通常用于关闭资源。
三种格式
try{} try{} try{}
catch(){} catch(){} finally{}
finally{}
catch是用于处理异常的,如果没有catch就代表异常没有被处理,如果该异常是检测时异常,必须声明.
异常在子父类中覆盖的体现
1.子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法自能抛出父类的异常或该异常的子类。
2.如果父类方法抛出多个异常,那么子类覆盖方法时,只鞥抛出父类异常的子集。
3.如果父类或者接口的方法没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常。
如果子类方法发生了异常,就必须进行try处理绝对不能抛。
注意:finally中定义的通常是关闭资源代码,因为资源必须释放
Finally只有一种情况不会执行,当执行到System.exit(0),finally不会执行。
异常的好处
1.将问题进行封装
2.将正常流程代码和问题处理代码相分离,方便于阅读
异常的处理原则:
1.处理方式有两种:try和catch
2.调用到抛出异常的功能时,抛出几个,处理几个。一个try对于多个catch
3.多个catch,父类的catch放到最下面
4.Catch内,需要定义针对性的处理方式,不要简单的定义printStackTrace输出语句。也不要不写
当捕获到的异常,本功能处理不了时,可以继续在catch中抛出
try
{
throw new AException();
}
catch(AException e)
{
throw e;
}
如果该异常处理不了,但并不属于该功能出现的异常,可以将异常转换后,再抛出和该功能相关的异常。
或者异常可以处理,当需要将异常产生的和本功能相关的问题提供出去。当调用者知道,并处理,也可以将捕获异常处理好,转换新的异常。
try
{
throw new AException();
}
catch(AException e)
{
//对AException处理
throw new BException();
}