Java异常处理(Java必备知识)

在程序设计和运行的过程中,程序员也是尽可能规避错误,但使程序被迫停止的错误仍然不可避免。Java提供了异常处理机制来帮助程序员检查可能出现的错误,提高了程序的可读性和可维护性。Java中将异常封装到一个类中,出现错误就会抛出异常。

异常概述

异常就是在程序运行时产生的错误,例如,向一个不存在的文本文件写入数据时,就会产生FileNotFoundException异常。

由于0不能当除数,所以在执行到这一行代码直接报错,然后程序直接就被中断了,以至于后面的代码也并未执行。Java中有很多异常,如空指针异常、数组下标越界异常、文件找不到异常等等。在java中,把上述异常都称为异常对象。当程序执行到某一个方法处产生异常时,Java虚拟机就会产生与已产生的异常相匹配的异常对象。如果不对异常处理,就会出现上述情况。

捕捉处理异常

什么是捕捉异常?通俗的理解,就是我可以通过try catch来进行抓异常,也就是我使用这个之后,即使出现错误,也可以让他程序继续执行以下的代码。

try {
    
    
	// 可能出现异常的代码块
} catch (Exception e) {
    
    
	// 对Exception的处理,可以打印异常,也可以做一些别的事情
}finally {
    
    
	// 无论成功与否都会执行的代码块,一般用于关流
}

通过下面例子会发现,程序虽然发生了错误,但是我最下面的语句依然执行了。这就是捕捉异常的作用。

使用try-catch代码捕捉并处理异常时,不会因为产生异常影响程序的执行。

如果遇到需要处理多种异常信息的情况下,可以在一个try代码块后面跟多个catch代码块,如果使用了多个catch代码块,则catch代码块的异常类顺序一定是先子类后父类,否则直接编译时异常。

由于ArithmeticException是Exception的子类,但是却放在了他的下面,这就会直接报错。

其次还需要注意的是finally也会有不执行的情况:

1、在finally代码块产生了异常
2、在前面的代码块使用了System.exit()退出程序
3、程序所在的线程死亡

在方法中抛出异常

如果某个方法可能会产生异常,但不想在当前方法中处理这个异常,则可以使用throws和throw关键字在方法中抛出异常。

使用throws关键字抛出异常

throws关键字常用于方法上,表示方法可能抛出异常,当方法抛出多个异常时,可用逗号分隔异常类型名。语法如下:

返回值类型 方法名(参数)throws 异常类型名{
    
    

}

Java异常有Runtime(运行时异常)和Checked(编译时异常),其中,所有RuntimeException类及其子类的实例被称为Runtime异常,不是RuntimeException类及其子类的异常实例都被称为Checked异常。

只有Java语言提供了Checked异常,就是必须在编译前处理,否则不予通过编译。即:没有完善处理的带啊根本就不会被执行。也就是说Java中除了RuntimeException及其任何子类,其他异常类都被Java异常强制处理机制强制异常处理。这些被强制异常处理的必须进行异常处理。否则就会提示 Unhandled exception type Exception 错误警告。而提示这个错误信息的方法,一定是这个方法所在的类用throws抛出了异常,所以在使用这个方法时候必须处理这个异常。

上图我故意在方法上抛出了一个SQLException异常,所以只要用这个方法,那就得处理异常,因为他不是运行异常,而是编译异常,至于是抛异常处理,还是try-catch处理,这个可以自行决定。

使用throw关键字抛出异常

throw关键字虽然可以用于抛出Exception类中的子类异常,但更重要的用途是抛出自定义异常。语法如下:

throw new 异常类型名(异常信息)

创建自定义异常时,需继承RuntimeException类或者Exception类。

public class PriceException extends RuntimeException{
    
    
	public PriceException(String message) {
    
    
		super(message);
	}
}

自定义异常的两种用法:
1、直接终止线程运行
需要注意的是throw new完异常之后,不能直接跟业务代码,否则运行异常。

2、只是记录打印一下日志,但是并不想终止程序

难点解答

throws关键字和throw关键字的区别

1、throws用在方法声明后,表示抛出异常,由方法调用者处理,而throw用在方法体内,用来制造异常,由方法体内的语句处理。
2、throws是声明这个方法会抛出这种类型的异常,让调用者知道使用的话需要捕捉这个异常,而throw是直接抛出异常实例。
3、throws是表示出现异常的可能性,而throw是一定产生异常。

异常使用原则

1、不要过度使用异常,虽然通过异常可以增强代码健壮性,但是使用过多不必要的异常处理,会影响效率。
2、不要使用过于庞大的try-catch块,过于庞大,业务过于复杂,会增加try块中出现异常的几率,从而增加分析产生异常原因的难度。
3、避免使用catch(Exception e)如果所有异常都采用相同的处理方式,将导致无法对不同异常进行分类处理。
4、异常既可以使用try-catch处理,也可以使用throws关键字处理,根据实际情况来判断使用哪种方式,两种关键的点就是,使用try-catch发生错误之后可以不影响线程继续执行下面代码,而throws代码抛出异常,也就是不管他,发生异常线程直接终止。
5、如果父类抛出多个异常,则覆盖方法只能抛出和基类方法相同或者更少的异常,异常类也可以抛出该异常类的子类(切记是子类,否则编译报错)。

其实这一点还是挺难理解的,首先子类继承父类重写方法,重写之后,父类发生的异常,子类不一定有,这个时候就可以确定一点,子类异常可以比父类异常少,但是他又是重写关系,所以又不能比父类异常多。

注意:如果有些代码发生异常之后没必要继续执行下去了,可以直接抛出异常,没必要try-catch来处理,如果发生异常还想让他继续执行下面代码,那么就try-catch处理。

猜你喜欢

转载自blog.csdn.net/weixin_43888891/article/details/113488697