------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
异常处理是衡量一门语言是否成熟的标准之一,目前主流编程语言如C++、C#、Ruby、Python等大多数都提供了异常处理机制。增加了异常处理机制后的程序有更好的容错性、更加健壮。Java中,当程序运行出现意外情形时,系统会自动生成一个Exception对象来通知程序,从而实现将“业务功能实现代码”和“错误处理代码”分离,提供更好的可读性。
下图说明了异常类的继承关系。
异常的分类
可控式异常:在Java中吧那些在编译时就能对程序中可能存在的错误进行处理,并给出具体的错误信息,我们把这些错误成为可控式异常。例如:文件读取错误、数据库操作错误等;常用的有:IOException、SQLException、ClassNotFoundException、NoSuchFieldException...
运行时异常:在Java中把一些在编译时检测不到,但是在运行时就会发生异常的错误,我们称为运行时异常。如进行除法运算,除数为零;把非数字通过parseInt方法转换成整数等。常用的有:数组越界异常、空指针异常、类转换异常、非法参数异常...
Java提供了一些方法处理异常:
try{
需要被检测的代码;
}
catch(异常类 变量){
处理异常的代码;(处理方式)
}finally{
一定会执行的语句;多是关于资源回收的代码,如:数据库连接、IO流的关闭、网络连接等
}
Demo d = new Demo();
try{
int x = d.div(5, 0);
System.out.println(x);
}
catch (ArithmeticException e){
System.out.println(e.toString());
System.out.println("除零了!");
//System.out.println(e.getMessage()); //返回该异常的详细描述字符串
//e.printStackTrace();//打印异常名称,异常信息,异常出现的位置,其实
//jvm的异常处理机制就是在调用printStackTrace方法,打印异常的堆栈跟踪信息。
}
catch (ArrayIndexOutOfBoundsException e){
System.out.println(e.toString());
System.out.println("角标越界了!");
}
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;
}
}
throws和throw的区别
throws使用在函数上,throw使用在函数内。throws后面跟的异常类,异常类可以是多个,并用逗号隔开;throw后跟的是异常对象。
自定义异常
由于项目中会出现特有的问题,但又没有被Java描述和封装对象,所以我们对于这些特有的问题可以按照Java对问题封装的思想。将特有的问题进行自定义的异常封装。自定义异常都应该继承Exception类,如果是自定义Runtime异常,则应该继承RuntimeException类。异常子类通常需要提供两个构造方法:一个是无参的,另一个是带字符串参数,这个字符串作为这个异常对象的描述信息。
以下就是对在进行除运算时,判断除数应该是不能小于0的数的代码。
class FuShuException extends Exception //getmessage
{
private int value;
FuShuException(){
<span style="white-space:pre"> </span>super();
}
FuShuException(String msg, int value){
super(msg);
this.value = value;
}
FuShuException(String msg){
super(msg);
}
public int getValue(){
return value;
}
}
class Demo3{
//该方法用于判断除数是否为负数
int div(int a,int b) throws FuShuException{
if(b<0){
throw new FuShuException("出现了负数是异常的情况。",b);//手动通过throw关键字抛出异常
}
return a/b;
}
}
总结:异常处理规则
不要过度使用异常,因为使用异常虽然可以避开对错误代码的处理,从而简单的抛出异常。虽然可以偷懒,但对于可以处理的错误代码而不进行处理,这样对程序的健壮性无益,不要用异常处理来代替正常的业务逻辑。如:异常处理遍历数组。
不要使用过于庞大的try块,这样增加了编程复杂度。正确方式是把大块的try分割成多个可能出现异常的段落,在单独的try...catch块中处理。
避免使用Catch All语句,Catch All语句指的是一种可以处理程序发生的所有异常的捕获模块。这种方法使得处理异常的方法变得千遍一律,不能很好的对异常进行分类处理。优点之一就是能加快编程进度,所以不可取。
不要忽略捕获到的异常,捕获到的异常就要处理而不是简单的在catch块打印异常信息或者什么也不干。我们应该处理异常,然后重新抛出异常,再在合适的层处理异常。