------- android培训、java培训、期待与您交流! ----------
在JAVA编写中,会出现各种失误导致的运行时产生的不正常情况,这种情况被称作异常。
Throwable
---Error(错误——严重)
---Exception(异常——非严重)
异常处理:
try
{
需要被检测的代码;
//try中问题代码被try检测到后,后面的代码便不会继续执行。
}
catch(异常类 变量)
{
处理方式;
//接收try抛给的问题代码
//问题代码被处理后,虚拟机会继续执行后面的语句。
对捕获到的异常对象进行常见方法操作:
1.String getMessage();(获取异常信息——异常名称)
2.toString();(对异常情况的简短描述——异常名称、异常信息)
3.printStacktrace();(追踪至异常出现的位置——异常名称、异常信息、异常位置) PS:该语句没有返回值,不可放进打印语句中;同时该语句也是JVM的默认异常处理机制。
}
finally
{
一定会执行的语句;(例:当进行数据库操作检测异常时,若数据操作出现异常,则需用finally做最后数据库的关闭工作。)
通常是关闭资源代码,因为资源必须要被释放。
(即使在之前return返回都不能阻止finally的执行,只有System.exit(0);语句才能阻止)
(System.exit是结束虚拟机。)
}
(在此,有三种格式:try-catch;try-catch-finally;try-finally。)
然而并不是所有的语句都需要用try处理,为了预防,可以通过throws 语句——在功能上通过throws的关键字声明了该功能有可能会出现问题。
发现异常后,需要对异常进行捕捉或再次抛出,否则程序无法顺利运行。
而声明异常时,不建议直接声明Exception,而是更加具体一些,这样处理的时候也会更加具体。
另:1.子类在覆盖父类时,如果父类的方法抛出异常,则子类的覆盖方法要么不抛出异常,要么只能抛出父类的异常或父类异常的子类异常;若子类真的发生父类异常之外的异 常,则只能在内部处理,不可以抛出。
2.若父类或接口没有异常抛出,则子类的异常只能用try进行内部处理,绝对不能抛出。
并且,可以在throws语句后面添加多个方法来处理多个异常。而用Exception均能处理是由于类的多态性,致使Exception能处理其所有子类的异常,但是这样会没有针对性,不建议直接声明。
建议有几个异常声明,就对应几个相对应的catch块进行处理,不要定义多余的catch块。如果catch块中出现了继承关系,父类异常的catch块向下放。
定义catch块时,一定要定义具体的处理方式,不要随意定义printStacktrace()或者输出语句。
自定义异常:因为项目中会出现一些特有问题,这些问题并未并未被java描述并封装对象。因此可以按照java对问题封装的思想,将特有的问题,进行自定义异常的封装。
例: class MyException extends Exception{}
自定义的异常一定是Exception的子类。且自定义异常需要在可能出现自定义异常的语句后加上throw关键字手动抛出异常对象。
注意:throw后面的语句是无法执行到的。
throw是指定语句抛出异常,throws是对方法可能抛出异常的一个声明。
特殊的异常子类:RuntimeException。
它和它的子类如果在函数内被手动抛出,函数上不需要任何(throws)声明。
且如果函数声明了该异常,调用者可以不用处理,编译一样通过。
同理,当自定义异常时,如果该异常的发生,无法再继续运算,就让自定义异常继承RuntimeException。
最后总结:
异常:
是对问题的描述。将问题进行对象的封装。
异常体系:
Throwable
|--Error
|--Exception
|--RuntimeException
异常体系的特点:异常体系中所有的类以及建立的异常都具有可抛性。
也就是说可以被throw和throws关键字所操作。
只有异常体系具备这个特点。
throw和throws的用法:
throw定义在函数内,用于抛出异常对象。
throws定义在函数上,用于抛出异常类,可以抛出多个用逗号隔开。
当函数内容有throw抛出的异常对象,并未进行try处理。必须要在函数上声明,否则编译失败。(RuntimeException除外)
如果函数声明了异常,调用者需要进行处理。
处理方式:throws 或者try。
异常有两种:
编译时异常,如果没有处理,编译失败。该异常被标识,代表可以处理。
运行时异常(编译时不检测)在编译时,不需要处理,编译器不检查。该异常发生,建议不处理,让程序停止,对代码进行修正。
异常处理语句:
try
{
被检测的代码
}
catch()
{
处理异常代码的语句
}
finally
{
一定会被执行的代码
}
自定义异常:按照java的面向对象思想,将程序出现的特有问题进行封装。
定义类继承Exception或者RuntimeException
1,为了让该异常具备可抛性。
2,让该类具备操作异常的共性方法。
要定义自定义异常信息时,可以使用父类已经定义好的功能。
异常信息传递给父类的构造函数。
异常的好处:
1.将问题进行封装。
2.将正常流程代码和处理问题代码分离,方便阅读。
异常的处理原则:
1.处理方式:try或者throws。
2.调用到抛出的异常时,抛出几个,处理几个。
3.多个catch时,父类catch要放在子类catch下面。
4.catch内,要有针对性的处理方式,不要简单处理。(例:用printStackTrace语句)
5.若捕获到的异常,catch功能中也处理不了的时候,可以继续抛出。