java异常机制详解

1.什么是异常呢?

     异常阻止当前方法或作用域继续执行的问题。

2.异常

异常指不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程。Java通 过API中Throwable类的众多子类描述各种不同的异常。因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的 错误条件。当条件生成时,错误将引发异常。

Java异常类层次结构图::

运行时异常:都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。

运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。

非运行时异常 (编译异常):是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。

3.throws的使用

关于throws抛出异常的两个小例子,用来说明调用者需不需要显示捕获:

1.这个例子中,抛出的异常是NumberFormatException,它是一个运行时异常,所以编译的时候不会检查到,在调用函数的时候,你可以显示捕获,也可以不捕获,程序不会报错。

2.这个例子中,抛出的异常是FileNotFoundException(为了说明问题,就写了这个异常),它是一个非运行时异常,所以编译的时候能检查到,在调用函数的时候,你必须显示捕获,否则程序编译不通过,可以看到judge()会报错。

throw语句用在方法体内,表示抛出异常,由方法体内的语句处理。
throws语句用在方法声明后面,表示再抛出异常,由该方法的调用者来处理。

throws主要是声明这个方法会抛出这种类型的异常,使它的调用者知道要捕获这个异常,所以你可以不catch,直接在方法后面抛出。
throw是具体向外抛异常的动作,所以它是抛出一个异常实例。

throws说明你有那个可能,倾向。
throw的话,那就是你把那个倾向变成真实的了。

总结下throws的作用(个人理解):

    1.当函数体中不想用try catch捕获异常时,可以通过throws直接抛出去,抛给调用者(刚学java的时候,都是直接抛出);

    2.就是和throw一起使用,throw是抛出具体的异常(可以在异常中加入自己的解释:throw new ArithmeticException("被除数为0的异常")),然后再在方法后面利用throws  ArithmeticException,这样当调用这个方法的时候,就知道可能有异常需要处理,起到一个提示作用;

总结一下throw的用法(个人理解):
    1.用法就是上面的第二个,和throws一起使用;

    2.和catch一起使用,当使用try catch捕获异常的时候,如果不用throw抛出的话,异常就被该方法自己处理了,外面是感知不到的,当出现异常后,调用者就不知道什么问题造成的,所以需要throw显示向外抛出。

   3.当碰到throw new XXXException(),程序就不会往下运行,而会执行finally的代码;但是不要在异常后面执行jvm方法:System.exit(0)。

   4.当catch里面没有throw new XXXException(),程序还会往下运行。

3.自定义异常

     在具体的开发中,根据业务的不同,可能会出现一些具体业务上产生的异常情况,这个时候就需要自己定义自己的具体异常,称为:自定义异常

自定义异常也是异常,应该是Exception的子类,需要继承Exception

//自定义一个异常:MyException
public class MyException extends Exception {
	public MyException(){	
	}
	
	public MyException(String msg){
		super(msg);
	}

}

public class TestMyException {
	//使用自定义异常
	public  static void excpFunc() throws MyException{
		throw new MyException("自定义异常");

	}

	public static void main(String[] args) {
		try {
			excpFunc();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

注意:
    当使用自定义异常时,在方法后一定要显示的throws 抛出该异常,这样在调用该方法的地方就知道需要处理异常。

后面会继续更新该文章.........................

猜你喜欢

转载自blog.csdn.net/u010020099/article/details/82013699