[学习笔记] Java异常处理

程序运行时,可能会发生各种错误,一些错误是可以避免的,还有些错误是随机出现的且不可避免,一个健壮的程序必须能够处理这些错误;

Java内置一套异常处理机制,使用异常来表示错误;

异常是一种类,本身带有类型信息,可以在任何地方抛出,但抛出以后需要在上层捕获;

所以的异常类都是Java.lang.Exception类的子类,Exception类是Throwable类的子类;

Throwable类继承自Object类,它有两个子类:Error类和Exception类,Error表示严重的错误,不在程序的处理范畴,而Exception表示异常,需要被捕获并处理;

Exception分为两个类:运行时异常(RuntimeException)、非运行时异常(包括IOException);

Java规定必须捕获的错误:Exception类及其子类这样的检查性异常,但不包括RuntimeException类及其子类;

Java规定不必捕获的错误:Error类及其子类,RuntimeExcepiton类及其子类;

捕获异常

使用try/catch关键字可用于捕获异常,try/catch代码块可以放在任何异常可能发生的地方;

try/catch代码块中的代码称为保护代码,语法如下:

可能发生异常的代码要放在try语句块中,catch语句块则捕获异常;

当try语句块中发生一个异常时,catch语句块就会被检查,若发生的异常包含在catch块中,异常会被传递到该catch块中,就像传递参数到方法中一样;

多个捕获块

一个try代码块后面可以跟随多个catch代码块,每个catch代码块分别捕获对应的异常及其子类,这样的情况叫做多重捕获;

try语句块后可以跟随任意数量的catch语句块,但只有一个catch语句块能被执行;

当try语句块发生异常时,异常会先抛给第一个catch语句块,并从上往下逐个匹配,当抛出异常的类型与某个catch语句块的异常类型匹配时,异常就会在这个catch块被捕获,并不再继续匹配;

存在多个catch语句块时,catch语句块的顺序很重要,异常的子类必须放在前面;

finally关键字

虽然finally语句块是写在catch语句块后面的代码,但finally语句块中的代码在try代码块后面执行;

无论try语句块中的代码是否发生异常,finally代码块中的代码总会被执行;

注意事项

catch语句块不能独立于try语句块存在;

finally语句块不是强制要求的,是可选的;

try语句块也不能独立存在,后面不能既没有catch语句块也没有finally语句块;

try、catch、finally语句块之间不能添加任何代码;

捕获多个异常

若某些异常的处理逻辑相同,但异常之间不存在继承关系,那就需要编写多个catch语句块分别来捕获这些异常;

实际上,一个catch语句块也可以匹配多个非继承关系的异常,只需在这些异常之间使用 | 连接;

异常的传播

若一个方法没有捕获到一个检查性异常,那么该方法必须将异常抛出到上层调用方法,直到它被某个try/catch语句块捕获为止;

throws/throw关键字

可以通过将throws关键字放在方法签名的尾部来声明要抛出的异常,并在方法内部通过throw关键字抛出异常对象;

throws声明异常

当一个方法产生一个它不处理的异常时,就需要在方法的头部声明此异常以便将异常传递到方法外部进行处理;

一个方法可以声明并抛出多个异常,多个异常之间通过逗号分隔;

throws方法用于声明一个方法可能抛出的所有异常信息,但不代表异常一定会发生;

throw抛出异常

与thorws不同,throw用于直接抛出一个具体的异常,throw关键字后面跟随的就是一个异常类对象;

当throw语句执行时,其后的语句将不再执行,此时程序转到上层调用程序执行,直到寻找到对应的catch语句处理异常或最外层的异常处理程序终止程序并打印调用栈情况;

try-with-resources

从JDK 7开始,可以使用try-with-resources来打开资源保证在语句执行完毕后每个资源都被自动关闭;

try语句块声明和实例化资源,catch语句块处理关闭资源时可能引发的所有异常;

try-with-resources语句块中可以声明多个资源,使用多个资源时使用分号 ;分隔各个资源;

自定义异常

在代码中抛出异常时,尽量使用JDK定义的异常类型,但我们也可以自己定义新的异常,需要记住的是自定义异常要是Throwable类的子类;

通用异常

Java中的异常还可以分为以下两种类型:

JVM异常:由JVM抛出的异常或错误,如NullPointerException;

程序级异常:由程序或API程序抛出的异常,如IllegalArgumentException;

NullPointerException

NullPointerException是最常出现的RuntimeException,NullPointerException即空指针异常;若一个对象为null,调用其方法或访问其字段就会产生此异常;

Original: https://www.cnblogs.com/cloudyzcy/p/16296193.html
Author: 糖小豆
Title: [学习笔记] Java异常处理

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/570864/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 指定一个目录下所有的java文件,把里面的内容格式化输出在md文件

    指定一个目录下所有的java 文件,把里面的内容格式化输出在md 文件 import java.io.;/ * @author Mxhlin * @Email fuhua277@1…

    Java 2023年6月7日
    057
  • Java多线程(三)

    Java多线程(三) Java多线程(三) – 五、线程的通信 5.1 wait() 与 notify() 和 notifyAll() 介绍: 5.2 wait() 的…

    Java 2023年6月9日
    068
  • 每天代码量多少正常?

    关于程序员每天代码量的讨论,众说纷纭。我个人觉得需要根据具体情况而定。 如果你刚实习,或刚步入工作不久,上司一般都会交给你一些简单的功能实现,这时候一般都含有大量简单而重复或者说类…

    Java 2023年6月13日
    092
  • java面试——流

    流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。 …

    Java 2023年6月9日
    098
  • 利用MySQL实现分布式锁,涉及到乐观锁和悲观锁的思想

    对于一些并发量不是很高的场景,使用MySQL来实现分布式锁会比较精简且巧妙。 下面就一个小例子,针对不加锁、乐观锁以及悲观锁这三种方式来实现。 主要是一个用户表,它有一个年龄的字段…

    Java 2023年6月8日
    0184
  • java技术难点

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年5月29日
    086
  • JAVA入门基础_从零开始的培训_JAVA中的正则表达式、处理文本的利器(五)

    正则表达式 基本语法 源码解析(基于上述代码) Matcher.find()方法 Matcher.group(int group)方法 二个常用类 Pattern(相当于一个正则表…

    Java 2023年6月9日
    086
  • 入驻博客园

    入驻博客园啦!!!! posted @2022-02-15 20:12 技术那点事儿 阅读(4 ) 评论() 编辑 Original: https://www.cnblogs.co…

    Java 2023年6月7日
    0102
  • List与Set

    List集合是Collection集合的子接口,其中的元素有序,并且可重复,元素可以通过下标访问。 接囗特有且常用的方法 1.add(int index, E element) v…

    Java 2023年6月5日
    099
  • Linux部署多个Tomcat配置修改

    多Tomcat部署配置修改 修改配置文件: /opt/tomcat8.5/nps-tomcat8865/conf/server.xml ,修改以下三个配置端口为未被占用端口 &lt…

    Java 2023年6月5日
    074
  • puppeteer去除webdriver标记问题+打包

    去除webdriver的正确写法 去除webdriver的错误写法 两种方法用node xxx.js 命令都可以正常的去除标记,但是如果打包成EXE文件去执行的话,下面这种代码就会…

    Java 2023年6月5日
    073
  • 3-面向对象(3)

    一、main()的使用说明 main()方法作为程序的入口 main()方法也是一个普通的静态方法 main()方法可以作为我们与控制台交互的方式。(之前:使用Scanner) 如…

    Java 2023年6月7日
    089
  • Java—泛型

    泛型出现的原因 Java的泛型是在JDK1.5开始才加上的。在此之前的Java是没有泛型的。没有泛型的Java使用起来给人感觉非常的笨重,为了体会泛型带来的好处,来看看如果没有泛型…

    Java 2023年6月7日
    070
  • SpringMvc(四)- 下载,上传,拦截器

    1、图片下载 图片下载:将服务器端的文件以流的形式写到客户端,通过浏览器保存到本地,实现下载; 1.1 图片下载步骤 1.通过session获取上下文对象(session.getS…

    Java 2023年6月15日
    088
  • Spring Boot 2.7.0发布,2.5停止维护,节奏太快了吧

    这几天是Spring版本日,很多 Spring工件都发布了新版本, Spring Framework 6.0.0 发布了第 4 个里程碑版本,此版本包含所有针对 5.3.20 的修…

    Java 2023年5月30日
    089
  • MySQL相关事项

    重启MySQL service mysql stop service mysql start service mysql restart 创建MySQL用户并允许远程访问 CREA…

    Java 2023年6月5日
    075
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球