异常:程序运行时出现的不正常情况
对于问题的划分:
1、严重的问题(java用Error类进行描述,一般没有针对性的代码对其进行处理)
2、非严重的问题(java用Exception类进行描述,有针对性的处理方式)
异常的处理:
try{
需要被检测的代码(当检测到有异常,则创建对应异常的对象,后面的语句不在执行)
}catch(异常类 e){
处理异常的代码(处理方式)
e.getMessage();//印异常信息
e.toString();//异常类名
e.printStackTrace( );//异常名称,异常信息,异常出现的位置,jvm默认的异常处理机制
}
finally{
一定会执行的语句
}
对多异常的处理:
1、声明异常时,建议声明为更具体的异常,这样可以更具体的处理
2、对方声明几个异常,就对应几个catch块
如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面
建立进行catch处理时,catch中一定要定义具体的处理方式
不要简单的定义一句e.printStackTrace( );也不要简单的就书写一条输出语句
因为项目中会出现特有的问题,而这些问题并未被java所描述,对于这些特有的问题可以按照java对问题封装的思想,将特有的问题进行自定义的异常封装
自定义异常:
自定义异常必须继承Exception
异常体系有一个特点,因为异常类和异常对象都被抛出,他们都具备可抛性,这个可抛性是Throwable这个体系中的独有特点
只有这个体系中的类和对象才可以被throw和throws操作
throws使用在函数上
throw使用在函数内
throws后面跟的异常类。可以跟多个,用逗号隔开
throw后跟的是异常对象
Exception中有一个特殊的子类异常RuntimeException运行时异常
如果在函数内容抛出该异常,函数上可以不用声明,编译一样通过
如果在函数上声明了该异常,调用者可以不用进行处理,编译一样通过
之所以不用在函数声明,是因为不需要让调用者处理,当该异常发生,程序停止,出现了无法继续运算,只有对代码进行修改
自定义异常时:如果该异常的发生,无法再继续进行运算,就让自定义异常继承RuntimeException
对于异常分二种:
1、编译时被检测的异常
2、编译时不被检测的异常(运行时异常,RuntimeException)
对于异常处理时常见问题:
1、丢失异常(捕获了异常却不作任何处理)
1、处理异常。针对该异常采取一些行动,例如修正问题、提醒某个人或进行其他一些处理,要根据具体的情形确定应该采取的动作。再次说明,调用printStackTrace算不上已经“处理好了异常”。
2、重新抛出异常。处理异常的代码在分析异常之后,认为自己不能处理它,重新抛出异常也不失为一种选择。
3、把该异常转换成另一种异常。大多数情况下,这是指把一个低级的异常转换成应用级的异常(其含义更容易被用户了解的异常)。
4、不要捕获异常。
结论一:既然捕获了异常,就要对它进行适当的处理。不要捕获异常之后又把它丢弃,不予理睬。
2、不指定具体异常(最常见的情形就是使用catch(Exception ex)语句)
在catch语句中尽可能指定具体的异常类型,必要时使用多个catch.不要试图处理所有可能出现的异常
3、占用资源不释放
程序用到了文件、Socket、JDBC连接之类的资源,即使遇到了异常,也要正确释放占用的资源。为此,Java提供了一个简化这类操作的关键词finally.
4、不说明异常的详细信息
在异常处理模块中提供适量的错误原因信息,组织错误信息使其易于理解和阅读
5、过于庞大的try块(把大量的代码放入单个try块)
尽量减小try块的体积>
6、输出数据不完整(全面考虑可能出现的异常以及这些异常对执行流程的影响。)
finally中存放一定会被执行的代码(通常用于关闭资源)
释放资源
finally
{
if (conn != null) {
try {
conn.close();
}
catch(SQLException sqlex2)
{
System.err(this.getClass().getName() + \".mymethod - 不能关闭数据库连
接: \" + sqlex2.toString());
}
}
if (out != null) {
try {
out.close();
}
catch(IOException ioex2)
{
System.err(this.getClass().getName() + \".mymethod - 不能关闭输出文件\"
+ ioex2.toString());
}
}
}