黑马程序员--学习笔记--Java异常处理

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

        异常处理是衡量一门语言是否成熟的标准之一,目前主流编程语言如C++、C#、Ruby、Python等大多数都提供了异常处理机制。增加了异常处理机制后的程序有更好的容错性、更加健壮。Java中,当程序运行出现意外情形时,系统会自动生成一个Exception对象来通知程序,从而实现将“业务功能实现代码”和“错误处理代码”分离,提供更好的可读性。

下图说明了异常类的继承关系。

黑马程序员--学习笔记--Java异常处理_第1张图片

异常的分类

        可控式异常:在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(){
		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块打印异常信息或者什么也不干。我们应该处理异常,然后重新抛出异常,再在合适的层处理异常。

你可能感兴趣的:(Java基础)