背景
不管是工作中还是面试中,异常这一块还是非常重要的。作为Java开发人员来说,学会如何处理异常,哪些异常必须自己处理,哪些异常可以往外抛等等,这些都是必需品。
生活总有你意想不到的惊喜和意外,我们的code也是一样。
异常不懂,佛祖也保佑不了你。
今天我们就来聊聊Java异常的话题。我们可以把Throwable当做Java异常的根类(祖宗)。因为实现类太多,所以下面大致列了几个常见的实现类。
Error
错误:表示系统级的错误和程序不必处理的异常,是 Java 运行环境中的内部错误或者硬件问题。
例如:内存资源不足等。
对于这种错误,程序基本无能为力,除了退出运行外别无选择,它是由 Java 虚拟机抛出的。
Exception
异常:表示需要捕捉或者需要程序进行处理的异常,它处理的是因为程序设计的瑕疵而引起的问题或者在外的输入等引起的一般性问题,是程序必须处理的。
Exception 又分为运行时异常,受检查异常。
RuntimeException(运行时异常)
表示无法让程序恢复的异常,导致的原因通常是因为执行了错误的操作,建议终止逻辑,因此,编译器不检查这些异常。
CheckedException(受检查异常)
是表示程序可以处理的异常,也即表示程序可以修复(由程序自己接受异常并且做出处理),所以称之为受检查异常。
Checked异常的处理方式有两种:
当前方法明确知道如何处理该异常,程序应该使用try--catch 代码块来捕获异常,然后在对应的catch模块中修复异常。
当前方法不知道如何处理这种异常,应该定义该方法时就声明跑出该异常。
Throwable 类常用方法?
- getMessage()方法:返回异常发生时的详细信息。
- getCause()方法:获得导致当前 Throwable 异常的 Throwable 异常。
- getStackTrace() 方法:获得 Throwable对象封装的异常信息。
- printStackTrace()方法:在控制台上打印。
请列出 5 个运行时常见异常?
- NullPointerException
- IndexOutOfBoundsException
- ClassCastException
- ArrayStoreException
- BufferOverflowException
异常处理有哪些关键字?
抛出异常:throw,throws
捕获异常:try,catch,finally
throw 与 throws 的区别 ?
- throw ,用于在程序中显式地抛出一个异常实例。
- throws ,用于指出在该方法中没有处理的异常。每个方法必须显式指明哪些异常没有处理,以便该方法的调用者可以预防可能发生的异常。最后,多个异常用逗号分隔。
异常处理中 finally 语句块的重要性?
不管程序是否发生了异常, finally 语句块都会被执行,甚至当没有catch 声明但抛出了一个异常时, finally 语句块也会被执行。
finally 语句块通常用于释放资源,如 I/O 缓冲区、数据库连接、释放锁等等。
异常使用方式
异常处理规则
如何自定义异常?
除了JDK定义好的异常类以外,在开发过程中我们也可以根据业务的异常情况自定义异常类。
用户自定义异常都应该继承Exception基类,如果用户想自定义Runtime异常,则应该继承RuntimeException基类。
定义异常时,通常有两个构造方法:
- 无参构造方法
- 有参构造方法,这个参数是字符串,这个字符串作为对该异常信息描述,也就是getMessage()方法的返回值(比如说:“用户密码有误”、“xx接口返回参数为空”等)。
不过在项目中可能没这么简单,可能还会对其进行再次封装。
但是基本上都是有两个参数:code+msg;
code:主要是对业务中的异常进行归类,结合Http的code来定义。
msg:主要是业务异常的信息提示。
你们项目中的自定义异常类是如何封装的呢?不知道的就回去翻翻你们项目中的自定义是如何写的,这就把学习和实践结合起来了。
总结
本文一共讲述了下面五个点:
- Java中异常的分类
- 常见异常有哪些
- 相关的关键字如何使用
- 异常的处理规则
- 如何自定义异常
本文转载自微信公众号「Java后端技术全栈」,可以通过以下二维码关注。转载本文请联系Java后端技术全栈公众号。