Java SE(十一)之异常处理(Exception)

2023-05-16

文章目录

  • 异常概述
    • 1.什么是异常?
    • 2.为什么要异常?
  • 异常体系及分类
    • 1.运行时异常
    • 2.编译时异常
  • 异常处理
    • 1.JVM默认处理方案
    • 2.try…catch…
    • 3.throw & throws
      • (1)抛出异常throw
      • (2)声明异常throws
      • (3)throw和throws比较
  • 自定义异常
    • 1.自定义编译时异常
    • 2.自定义运行时异常
  • 异常的使用规则

异常概述

1.什么是异常?

异常是程序在“编译”或者“执行”的过程中可能出现的问题,(语法错误不算在异常体系中)
比如:数组索引越界、空指针异常、 日期格式化异常,等…

2.为什么要异常?

如果没有异常会怎么样?

  • 无法穷举所有异常情况
  • 错误处理代码和业务实现代码混杂
  • 代码量增加

所以:
1.异常一旦出现了,如果没有提前处理,程序就会退出JVM虚拟机而终止.
2.避免异常,然后提前处理异常,体现的是程序的安全, 健壮性

异常处理机制:当程序运行出现意外情形时,系统会自动生成一个Exception对象来通知程序

异常体系及分类

异常体系如下图:

在这里插入图片描述

Error:
系统级别问题、JVM退出等,代码无法控制

Exception:java.lang包下,称为异常类,它表示程序本身可以处理的问题

  • RuntimeException及其子类:运行时异常,编译阶段不会报错。 (空指针异常,数组索引越界异常) ——程序员的主要关注点
  • 除RuntimeException之外所有的异常:编译时异常,编译期必须处理的,否则程序不能通过编译。 (日期格式化异常)。

Throwable常用方法(一般用来返回异常信息):

在这里插入图片描述

1.运行时异常

直接继承自RuntimeException或者其子类,编译阶段不会报错,运行时可能出现的错误

常见运行时异常:

  • 数组索引越界异常:ArraylndexOutOfBoundsException
  • 空指针异常:NullPointerException,直接输出没有问题,但是调用空指针的变量的功能就会报错。
  • 数学操作异常:ArithmeticException
  • 类型转换异常:ClassCastException
  • 数字转换异常: NumberFormatException

(一般是程序员业务没有考虑好或者是编程逻辑不严谨引起的程序错误)

2.编译时异常

不是RuntimeException或者其子类的异常,编译阶就报错,必须处理,否则代码不通过

一般遇到情况 比较少,直接举个例子:

在这里插入图片描述

异常处理

1.JVM默认处理方案

如果程序出现了问题,我们没有做任何处理,最终JVM会做默认的处理

  • 把异常的名称,异常原因及异常出现的位置等信息输出在了控制台
  • 程序停止执行

缺点:直接从当前执行的异常点干掉当前程序。后续代码没有机会执行了,因为程序已经死亡

2.try…catch…

监视捕获异常,用在方法内部,可以将方法内部出现的异常直接捕获处理。

格式:

try {
可能出现异常的代码;
} catch(异常类名 变量名) {
异常的处理代码;
}

执行流程:

1.程序从try里面的代码开始执行

2.出现异常,会自动生成一个异常类对象,该异常对象将被提交给Java运行时系统

3.当Java运行时系统接收到异常对象时,会到catch中去找匹配的异常类,找到后进行异常的处理执行完毕之后,程序还可以继续往下执行

3.throw & throws

(1)抛出异常throw

很多时候,在当调用方法使用接受到的参数时,首先需要先对参数数据进行合法的判断,数据若不合法,就应该告诉调用者,传递合法的数据进来。这时需要使用抛出异常的方式来告诉调用者

具体操作:

  1. 创建一个异常对象。封装一些提示信息(信息可以自己编写)。

  2. 需要将这个异常对象告知给调用者。怎么告知呢?怎么将这个异常对象传递到调用者处呢?通过关键字throw就可以完成。throw 异常对象。

throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行。语法:

throw new 异常类名(参数);

e.g.

public class ThrowDemo {
    public static void main(String[] args) {
        //创建一个数组 
        int[] arr = {2,4,52,2};
        //根据索引找对应的元素 
        int index = 4;
        int element = getElement(arr, index);

        System.out.println(element);
        System.out.println("over");
    }
    /*根据 索引找到数组中对应的元素*/
    public static int getElement(int[] arr,int index){ 
       	//判断  索引是否越界
        if(index<0 || index>arr.length-1){
             /*
             判断条件如果满足,当执行完throw抛出异常对象后,方法已经无法继续运算。
             这时就会结束当前方法的执行,并将异常告知给调用者。这时就需要通过异常来解决。 
              */
             throw new ArrayIndexOutOfBoundsException("角标越界了```");
        }
        int element = arr[index];
        return element;
    }
}

注意主程序在getElement处异常就停止了,不会再输出后面的over语句。

(2)声明异常throws

关键字throws运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(抛出异常).

抛出异常格式:

1.方法 throws 异常1,异常2,异常3 …{ }
2.方法 throws Exception{ }

(3)throw和throws比较

在这里插入图片描述

自定义异常

因为Java无法为这个世界上全部的问题提供异常类,所以某些时刻需要自定义异常

1.自定义编译时异常

定义一个异常类继承Exception.
重写构造器。
在出现异常的地方用throw new 自定义对象抛出

作用:编译时异常是编译阶段就报错,提醒更加强烈,一定需要处理!!

2.自定义运行时异常

定义一个异常类继承RuntimeException.
重写构造器。
在出现异常的地方用throw new 自定义对象抛出!

作用:提醒不强烈,编译阶段不报错!!运行时才可能出现!!

在这里插入图片描述

异常的使用规则

1.不要过度使用异常

  • 把异常和错误混淆在一起,不编写任何错误处理代码,而是简单地抛出异常来代替所有错误处理
  • 使用异常处理来代替流程控制

2.不要使用过于庞大的try块
try块过于庞大,难免后面会跟大量的catch块,此时需要分析他们之间的逻辑关系,反而导致了编程复杂度的增加

3.尽量提供对每个最小异常的处理
若每个异常都采用相同的处理方式,会导致无法对不通过异常分情况处理,以跟踪错误发生的原因

4.不要忽略捕获到的异常
在合适的层处理异常

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java SE(十一)之异常处理(Exception) 的相关文章

  • 在 Kotlin 中实现返回 Collection 的 Java 方法

    我将 Kotlin 与 Spring Security 结合使用 实现该方法时 public interface UserDetails extends Serializable Collection
  • .java 和 .scala 类之间是否可能存在循环依赖?

    假设我在 java 文件中定义了类 A 在 scala 文件中定义了类 B A 类使用 B 类 B 类使用 A 类 如果我使用 java 编译器 则会出现编译错误 因为 B 类尚未编译 如果我使用scala编译器A类将找不到 有没有可以同时
  • Spring webflow 应用程序:HTTP 302 暂时移动

    我的 java 应用程序中的每个请求都会生成另外 2 个带有 HTTP 302 错误的请求 例如 如果请求查看名为板 html 这个请求是从首页 html 我收到按以下顺序生成的 3 个请求 POST home html 302 Moved
  • 删除 servlet 中的 cookie 时出现问题

    我尝试使用以下代码删除 servlet 中的 cookie Cookie minIdCookie null for Cookie c req getCookies if c getName equals iPlanetDirectoryPr
  • 无法从后台服务通过 WiFi 访问互联网

    我将直接介绍我发现的一些事实 数据 如果您遇到 解决了类似的问题 请帮助我 我每 5 分钟向服务器发送一次数据 除非用户在服务器的帮助下手动将其关闭 wakeful broadcast receiver通过一个intent service
  • 我们可以在三元运算符(Java)中使用命令吗?

    这是一个工作代码 String a first String b second String object System out println object null a b 但它不是 String a first String b se
  • 如何模拟一个方面

    我目前正在使用aspectj 开发一些监控工具 因为这个工具应该是技术独立的 尽可能 所以我没有使用 Spring 进行注入 但我希望我的方面能够经过单元测试 方面示例 Aspect public class ClassLoadAspect
  • Java 的 QP 求解器 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • getClassLoader().getResource() 返回 null

    我有这个测试应用程序 import java applet import java awt import java net URL public class Test extends Applet public void init URL
  • 会话 bean 中的 EntityManager 异常处理

    我有一个托管无状态会话 bean 其中注入了 EntityManager em 我想做的是拥有一个具有唯一列的数据库表 然后我运行一些尝试插入实体的算法 但是 如果实体存在 它将更新它或跳过它 我想要这样的东西 try em persist
  • LibGdx 如何使用 OrthographicCamera 滚动?

    我已经找了 10 个小时 字面意思 我已经完成了 我需要问一下 事情是我正在学习如何使用 LibGdx 来编写 Java 游戏 我正在做一个水平太空飞船游戏 所以 我最糟糕的问题是我不知道如何滚动 我认为绘制会更好地解释 我想绘制一个巨大的
  • 使用外部硬盘写入和存储 mysql 数据库

    我已经设置了 mysql 数据库在我的 Mac 上使用 java 和 eclipse 运行 它运行得很好 但现在我将生成大约 43 亿行数据 这将占用大约 64GB 的数据 我存储了大量的密钥和加密值 我有一个 1TB 外部我想用作存储位置
  • 嵌入式 tomcat 7 servlet 3.0 注释不起作用

    我有一个精简的测试项目 其中包含 Servlet 版本 3 0 用注释声明 如下所示 WebServlet test public class TestServlet extends HttpServlet private static f
  • @TestPropertySource 不适用于 Spring 1.2.6 中使用 AnnotationConfigContextLoader 的 JUnit 测试

    似乎我在 Spring 4 1 17 中使用 Spring Boot 1 2 6 RELEASE 所做的任何事情都不起作用 我只想访问应用程序属性并在必要时通过测试覆盖它们 无需使用 hack 手动注入 PropertySource 这不行
  • RMI 服务器:rmiregistry 或 LocateRegistry.createRegistry

    对于服务器端的RMI 我们需要启动吗rmiregistry程序 或者只是调用LocateRegistry createRegistry 如果两者都可以的话 各有什么优点和缺点 他们是同一件事 rmiregistry是一个单独的程序 您可以从
  • 为什么在尝试使用 Java 连接到 RDS PostgreSQL 数据库时会收到 SocketTimeoutException?

    我有一个 Spring 应用程序 我试图在 AWS 上托管 几天来我一直在努力配置 我有一个 EC2 实例 并且能够通过 SSH 连接到它 我还在 AWS 中设置了 Postgres RDS 数据库 但我无法使用 IDE 中的代码连接到它
  • java中的比较器链

    正在阅读Oracle 关于接口的 Java 教程 https docs oracle com javase tutorial java IandI createinterface html其中给出了一个例子Card 打牌 我试图理解接口中的
  • Android同步onSensorChanged?

    这是我的问题的后续 Android线程可运行性能 https stackoverflow com questions 36395440 android thread runnable performance 我在理解应用程序的同步方法时遇到
  • Java 9 中紧凑字符串和压缩字符串的区别

    有什么优点紧凑的字符串 http openjdk java net jeps 254JDK9 中的压缩字符串 压缩字符串 Java 6 和紧凑字符串 Java 9 都有相同的动机 字符串通常实际上是 Latin 1 因此浪费了一半的空间 和
  • 如何使用 Spring AOP 建议静态方法?

    在执行类的静态方法之前和之后需要完成一些日志记录 我尝试使用 Spring AOP 来实现这一点 但它不起作用 而对于正常方法来说它起作用 请帮助我理解如何实现这一点 如果可以使用注释来完成 那就太好了 也许您应该在使用 Spring AO

随机推荐

  • Zookeeper机制和应用场景

    Zookeeper简介 Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目 xff0c 它主要是用来解决分布式应用中经常遇到的一些数据管理问题 xff0c 如 xff1a 统一命名服务 状态同步服务 集群管理 分
  • crontab定时器

    crontab定时器 linux下的定时任务 1 编辑使用crontab e 一共6列 xff0c 分别是 xff1a 分 时 日 月 周 命令 2 查看使用crontab l 3 删除任务crontab r 4 查看crontab执行日志
  • Linux后台运行程序

    在我们平常的时候运行程序的时候会产生很多的信息 xff0c 这些信息有时候有用 xff0c 有时候没用 xff0c 不过这些数据都会在该程序的log中保存 xff0c 所以把这些信息放在前台就不是很好 我们可以将脚本放在后台运行 xff0c
  • vnc的两种配置方法及解决vnc连不上的情况

    1 vnc连不上的现象 xff1a Timed out waiting for a response from the computer 解决方法 xff1a sudo sbin iptables I INPUT 1 p TCP dport
  • 【随写笔记】TouchGFX

    https www cnblogs com firege p 5805823 html https blog csdn net u013766436 article details 50805808 LTDC STM32F429系列芯片内部
  • BGP路由协议

    特点 BGP是一种外部网关协议 xff08 EGP xff09 xff0c 不擅长路由计算 xff0c 擅长路由控制 OSPF ISIS等内部网关协议 xff08 IGP xff09 xff0c 擅长路由计算 xff0c 不擅长路由控制 B
  • sed命令的使用(合并行)

    1 把所有不以句号结尾的行 xff0c 和下一行合并 span class token function sed span i span class token string 39 N s n 39 span abc txt 2 把两行合并
  • Mybatis常见面试题及答案

    文章目录 1 什么是Mybatis xff1f 2 Mybaits的优缺点 xff1a 3 和 的区别是什么 xff1f 4 通常一个mapper xml文件 xff0c 都会对应一个Dao接口 xff0c 这个Dao接口的工作原理是什么
  • HDFS排查路径

    遇到HDFS的问题 xff0c 首先需要排除可用类问题 可用类问题按影响 紧急程度不同 xff0c 可继续分为HDFS功能性受损 lt 61 HDFS高可靠性 高可用性受损 按照以下步骤进行排查 xff0c 以下任意一项有异常 xff0c
  • Docker复习: jar包打成docker

    FROM openjdk 8 ARG JAR FILE COPY springbootmybatis 1 0 SNAPSHOT jar app jar EXPOSE 9012 ENTRYPOINT 34 sh 34 34 c 34 34 j
  • iscsi磁盘挂载并设置为开机自动挂载

    前提准备 xff1a 安装iscsi客户端软件 yum y install iscsi initiator utils 第一步 xff1a 发现ISCSI设备 root 64 sdw4 iscsiadm m discovery t st p
  • 关于华为AC6507S能ping通web和ssh却登录不上排障记录(管理面隔离)

    一 客户描述PC和服务器能ping通AC但是web却登录不上 测试 xff1a 设置服务器地址为192 168 0 100 24 AC地址192 168 0 2 24 用0 100去ping0 2可以ping通 xff0c web登录连接失
  • tensor 和 numpy 的互相转换

    为什么要相互转换 xff1a 简单一句话 numpy操作多样 简单 但网络前向只能是tensor类型 各有优势 所以需要相互转换补充 convert Tensor x of torch to array y of numpy y 61 x
  • 图像畸变矫正算法实现 matlab版

    真正的相机镜头不理想 xff0c 并在图像中引入一些失真 为了解释这些非理想性 xff0c 有必要在透视投影的方程中添加失真模型 一 原图如下 xff1a 二 实现的效果图 三 算法具体实现 function undistorted img
  • Pytorch学习笔记(六)之完整的模型训练(以Cifar10为例)

    文章目录 前言 xff1a 数据集介绍0 准备工作 xff1a 首先导入相关包 xff0c 设置参数等1 数据预处理之增强 transforms等 2 数据的读取 Dataset amp Dataloader 3 模型的搭建 nn mode
  • 对抗攻击(Adversarial Attack)

    文章目录 对抗攻击对抗防御 对抗攻击 图片可以看成一个很长的向量 xff0c 如果在图片的每个像素上都加上一个很小的pertubation 扰动 杂讯 xff0c 再把它输入到神经网络 xff0c 这个时候分类器可能就会误判 没有被攻击的图
  • 【对抗攻击论文笔记】对抗迁移性:Delving Into Transferable Adversarial Examples And Black-Box Attacks

    文章目录 论文概述ideamethod 详细内容摘要1 介绍2 对抗深度学习和可迁移性2 1 对抗深度学习问题2 2 对抗样本生成的方法2 3 评估方法 3 非定向对抗样本3 1 基于优化3 2 基于FGSM 4 定向对抗样本5 集成的方法
  • CoCo数据集下载

    文章目录 1 介绍2 下载2 1 官网2 2 百度网盘2 3 下载到linux服务器 1 介绍 MS COCO的全称是Microsoft Common Objects in Context xff0c 起源于微软2014年的Microsof
  • 最新win10重装系统官方纯净版——2022家庭版多图详细

    文章目录 前言 xff08 碎碎念 xff09 0 设备规格1 备份2 制作启动盘2 1 准备U盘2 2 下载win10 安装包 3 重装系统3 1 插入系统安装盘 xff08 U盘 xff09 3 2 将固态硬盘分区 4 重装之后4 1
  • Java SE(十一)之异常处理(Exception)

    文章目录 异常概述1 什么是异常 xff1f 2 为什么要异常 xff1f 异常体系及分类1 运行时异常2 编译时异常 异常处理1 JVM默认处理方案2 try catch 3 throw amp throws xff08 1 xff09