欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java异常机制详解

程序员文章站 2022-07-11 11:53:02
...

1.什么是异常呢?

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

2.异常

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

Java异常类层次结构图::

java异常机制详解

 

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

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

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

3.throws的使用

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

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

java异常机制详解

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

java异常机制详解

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 抛出该异常,这样在调用该方法的地方就知道需要处理异常。

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