Java中常见的异常总结,Exception如何捕获和处理

2023-10-29

什么是异常
异常机制:异常机制是指当程序出现错误后,程序如何处理。具体来说,异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器。通俗一点来说:就是为了让程序不被中断,继续执行。
程序错误:

(1)编译错误:是因为程序没有遵循语法规则,编译程序能够自己发现并且提示我们错误的原因和位置。
(2)运行时错误:是因为程序在执行时,运行环境发现了不能执行的操作。
(3)逻辑错误:是因为程序没有按照预期的逻辑顺序执行
异常也就是指程序运行时发生错误,而异常处理就是对这些错误进行处理和控制。

虚拟机对异常的两种处理方式

1,捕获异常
2,抛出异常
异常结构图
异常结构图
异常收集

序号 异常名称 异常描述
1 java.lang.NullPointerException 空指针异常:对象为空,并且调用相应方法。
2 java.lang.ClassNotFoundException 找不到指定类
3 java.lang.ArrayIndexOutOfBoundsException 数组下标越界
4 java.lang.NumberFormatException: 数字格式化异常
5 java.lang.ArithmeticException: 数学运算异常
6 java.lang.StackOverflowError 内存空间溢出错误,方法递归调用中,经常发生
7 java.lang.ClassCastException 类型转换异常,向下转型中经常发生
8 java.text.ParseException 时间格式化异常,SimpleDateFormart中经常发生
9 java.util.InputMismatchException 输入类型不匹配异常
一,捕获异常

1.try-catch
try:尝试着执行可能会出现异常的代码
catch:如果try中的代码在执行过程中,出现了异常,捕获该异常,如果没有异常,就不执行。

//单个try-catch
try{

}catch(){
}
//多个catch
try{

}catch(){

}catch(){

}
//多个catch在捕获异常时,子类异常catch块要放在前面,父类异常catch块放在后面
try{
    
}catch(){
    
}finally{
    //通常用来释放资源
}

@Test//空指针异常--引用为空,还去调用方法。
    public void test(){
        Book [] books = new Book[5];
        //System.out.println("books[0].getName()="+books[0].getName());
        String s = null;
        System.out.println(s);
        System.out.println(s.length());
    }
    @Test//数组下标越界异常
    public void test1(){
        Book [] books = new Book[5];
        books[5]=new Book();
    }


public static void main(String[] args) {
        //捕获异常 != 解决异常
        for (int i = 1; i <= 5; i++) {
            Scanner sc = new Scanner(System.in);
            try {
                System.out.printf("请录入第 %d 名同学的成绩:",i);
                int score = sc.nextInt();
                System.out.println("");
                //break;
                //return;
                //System.exit(1);//强制性关闭虚拟机
            }catch (InputMismatchException e){
                System.out.println("出现了输入类型不匹配的异常--精准捕获");
                //break;
                //return;
                System.exit(1);
            }catch (NullPointerException e){
                System.out.println("出现了空指针异常");
            }catch (RuntimeException e){
                System.out.println("运行时异常,是上面两个异常的父类---放大捕获");
            }catch (Exception e){
                System.out.println("运行时异常,是上面两个异常的父类---在放大捕获");
            }catch (Throwable e){
                System.out.println("运行时异常,是上面两个异常的父类---再再放大捕获");
            }finally {
                System.out.println("最终代码块--不管是否有异常,都会执行,break,return不具备躲避finally功能");
            }

        }
    }

Java的异常机制:
1.建立大量的用于表述某种异常的类,组成一个以Throwable为首的异常家族。
2.当程序执行出现异常时,立即创建相应异常类的对象。
3.使用catch(异常类 e)捕获创建的异常对象。

二,声明和抛出异常

1.使用throws声明异常
运用于方法声明之上,用于表示当前方法不处理异常,而是提箱该方法的调用者类处理异常

public void fun1() throws ParseException {
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date date = format.parse("2020-10-12");
}

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

public void fun2() {
     throw new NullPointerException("空指针异常");  
     System.out.println("hello world");//会报红,提示unreachable statement,该语句不可能被执行
}

@Test//嵌套try-catch
public void fun2()  {
    try {
        throw new Exception("非运行时异常,哈哈哈");
    } catch (Exception e) {
        e.printStackTrace();
        try {
            throw new ParseException("解析异常,哈哈哈",0);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }finally {
        try {
            throw new TimeoutException("超时异常,哈哈哈");
        } catch (TimeoutException e) {
            e.printStackTrace();
            try {
                throw new SQLException("SQL异常");
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }
    }
}

//代替返回语句
public int  funR1(){
        try {
            return 1;
        }catch (Exception e){
           throw new RuntimeException();
        }
    }
public int  funR2(){
    if(true) {
        return 1;
    }else{
        throw new RuntimeException();
    }
}
三,自定义异常

JDK中定义了大量的异常类,可以描述编程时出现的大部分异常情况,但对于一些特殊情景下的异常,我们可以自己去定义。
创建步骤:
创建一个异常类
加入异常家族中(继承某个异常父类)

public class HeroNotExistException extends RuntimeException {
    private String m;public String getM() {
        return m;
    }public void setM(String m) {
        this.m = m;
    }
//两个参数的有参构造,一个传递给父类Throwable,一个自己用
    public HeroNotExistException(String message, String m){
       super(message);
       this.m=m;
    }public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入您最欣赏的历史人物:");
        String name = sc.next();
        if(name.equals("孙悟空")){
            try{
                throw new HeroNotExistException("英雄人物不存在","哈哈");
            }catch (HeroNotExistException e){
                e.printStackTrace();
                System.out.println(e.getM());
            }
        }
    }
    
}

总结
1、java中异常分为两大类:
checked exception (非运行时异常)
unchecked exception (运行时异常)

2、java中所有的异常类都会直接或间接地继承自Exception。

3、RuntimeException类也是直接继承Exception类,它叫运行时异常,换句话说:java中所有的运行时异常都会直接或间接继承自RuntimeException。

4、java中凡是继承自Exception而不是继承自RuntimeException的类都是非运行时异常。对于非运行时异常,必须要对其进行处理,处理方式有两种:
使用try…catch捕获处理
在所在方法声明 throws Exception

5、对于运行时异常,我们可以不对其处理,推荐不对其处理

6、空指针异常,出现该异常时原因市在于某个引用为null,但是还使用它调用方法。

7、自定义异常,通常就是定义了一个继承自Exception类的子类,那么这个类就是一个自定义异常类。通常情况下,我们都会直接继承自Exception,一般不会继承某个运行时异常类。

8、我们可以使用多个catch块来捕获异常,这时需要将父类型catch块放到子类型catch之后,这样才能保证后续的catch可能被执行,否则子类型的catch将永远无法到达,java编译器会编译报错。

11、如果try块中存在return语句,那么首先也需要将finally块中的代码执行完毕,然后方法再返回。

12、如果try块中存在System.exit(0),会终止当前运行的java虚拟机,程序会强制性结束执行。

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

Java中常见的异常总结,Exception如何捕获和处理 的相关文章

  • ClientRequestFactory RestEasy 已弃用...还有其他 RestEasy 替代方案吗?

    我需要使用其他人创建的 RestService 的接口来创建轻松的客户端 这工作很好 除了一件事 当我从rest easy 2 3 5 Final更新到resteasy 3 0 x时 Client RequestFactory类看起来像 D
  • cucumber.json 报告被重新运行场景报告覆盖

    我有一个具有相同技术堆栈 JAVA1 8 Cucumber JVM JUnit Maven 的 UI 测试项目和一个 API 测试项目 这两个项目都向我展示了这个问题 可能是因为两者都存在相同的依赖关系集 我使用了使用 maven sure
  • Eclipse JAVA工具jar不存在

    The archive C Java jdk1 6 0 26 32 lib tools jar which is referenced by the classpath does not exist 这是我运行Tomcat时遇到的错误 清理
  • 如何在Eclipse中制作war文件[重复]

    这个问题在这里已经有答案了 制作war文件的简单方法是什么 当我右键单击 在服务器上运行 时 我的项目正在运行 但我想部署在 tomcat 服务器上 我已经安装了m2clipse但这给了我一个错误 maven是否必须制作war文件 我需要特
  • AJAX(原型/java)在执行期间获取部分状态更新

    这部分模仿了AJAX 原型 php 在脚本执行期间获取部分状态更新 https stackoverflow com questions 800997 ajax prototype php getting partial status upd
  • 如何使用 Java2D 创建硬件加速图像?

    我正在尝试创建一个快速图像生成器 它可以执行大量 2d 转换和形状渲染 因此我尝试使用 BufferedImage 然后获取 Graphics2D 对象来执行所有绘图 我现在主要关心的是 make 速度非常快 所以我创建一个像这样的 Buf
  • 是否有适用于 Java 的 Harel Statechart DSL 工具?

    我正在寻找一种能够理解 DSL 的工具 在其中我可以定义生成 Java 代码的状态图 或者 DSL 中的状态图可以按原样运行 该工具最好用 Java 编写 并且必须根据 Harel 状态图 或等效的 UML 2 状态机 的定义支持超级状态和
  • JConsole主类

    我正在尝试使用其 Main 类从命令行启动 JConsole 我提取了 jconsole jar 的内容 在 MANIFEST MF 中我可以看到 Main Class sun tools jconsole JConsole 所以我尝试运行
  • 是否可以将 BitmapDescriptor 转换为 Bitmap?

    我需要将 BitmapDescriptor 转换为 Bitmap 我可以使用以下代码将位图转换为 BitmapDescriptor BitmapDescriptor bd BitmapDescriptorFactory fromBitmap
  • 如何统计lucene索引中每个文档的term数?

    我想知道 lucene 索引中每个文档的术语数量 我一直在 API 和互联网上搜索 但没有结果 你能帮助我吗 Lucene 的构建是为了回答相反的问题 即哪些文档包含给定术语 因此 为了获取文档的术语数量 您必须进行一些修改 第一种方法是存
  • Java 线程 JavaDoc

    我编写了一个只能在特定线程上调用的方法 是否应该将标准注释或注释添加到方法的 javadoc 中来表示这一点 不知道有任何这样的标准注释 Java 并发实践 http www javaconcurrencyinpractice com 在第
  • ImageIO read() 和 write() 操作后 GIF 图像变得错误

    我有这个代码 它只是读取 GIF 文件 用背景重新绘制它 然后输出到新的 GIF 文件 问题是结果文件变得奇怪 我不知道为什么它的质量变得很差 JPG 文件不会出现此问题 如何修复它 import java awt Color import
  • javax.validation 的 @AssertTrue - 它不应该创建错误消息吗?

    我在 Spring MVC 命令 bean 中有以下代码 AssertTrue public boolean isConditionTrue return false private boolean conditionTrue 我的 JSP
  • Java JDT 解析器。获取VariableDeclarationFragment的变量类型

    我一直在用 JDT 实现 Java 解析器 但我不知道当变量的节点类型为变量声明片段 我只有在涉及到时才发现如何获取变量类型变量声明 我的代码如下 public boolean visit VariableDeclarationFragme
  • android 中的 lang.NumberFormatException

    我有以下代码 除了在后台线程中从数据库读取一些值并使用这些值之外什么也不做 我使用 jar 绘制折线图 对于我用于每个数组值的折线图 问题是第三个我传递给绘制 LineChart 的构造函数的参数是 float float viteza S
  • Eclipse 错误:“设置构建路径”遇到错误

    我正在使用一个名为 jtwitter 的 API 它有一个 jar 文件 jtwitter jar 我一直在使用它并使用 git 维护它 我把代码托管在github上 有些天 我没有碰过它的代码 今天 当我克隆我的 git repo 时 实
  • JNA Windows 服务启动类型

    我一直在使用 JNA 并且能够使用下面的代码返回 Windows 服务的状态 即启动或停止 但我不确定如何返回服务的启动类型 我确信 JNA 之外还有其他方法 但如果可能的话我想继续使用 JNA import com sun jna imp
  • ClassNotFoundException:在嵌入了 cxf 依赖项的 OSGi 包中找不到 org.glassfish.jersey.internal.RuntimeDelegateImpl

    这与jax rs 2 0 更改默认实现 https stackoverflow com questions 17366266 jax rs 2 0 change default implementation我有一个 OSGi 包 其中包含
  • AWS Java SDK 中 DynamoDB v2 的迁移详细信息?

    有没有人对新的命名空间进行了更改 com amazonaws services dynamodbv2 以及 AWS Java SDK 1 4 2 及更高版本 中 DynamoDB 的接口 本地二级指数的发布显然需要根据1 4 2 发行说明
  • 如何指示 yum 安装特定版本的 OpenJDK

    我尝试安装openjdk in the redhat服务器 如何安装指定版本 我要安装的版本是 11 0 4 使用以下命令安装的版本是11 0 6 yum install java 11 openjdk devel 曾与 yum showd

随机推荐

  • 【Linux】进程信号

    1 理解信号 1 信号 能够识别并做出行为的一种指令 2 信号来临的时候不一定能够立即对信号做出处理 但是并不影响信号的产生 3 信号来临 gt 时间窗口 gt gt 被处理 结果是要处理的但是需要时间 4 对待信号的处理方法 1 默认2
  • vue父组件向子组件传值

    子组件
  • JAVA IO流文本文件读入方法(read方法读入数据)

    在字符流通常都使用read方法读入数据 而read方法一般都两种调用方式 首先先创建一个文件 如Hello txt 里面输入HelloWorld 第一种是使用read的空参调用 read read 从输入流中读入一个字符 若当前位置无数据则
  • 进制转换方法

    常用计算机各进制的含义和相互之间的简单转换方法 文章目录 常用计算机各进制的含义和相互之间的简单转换方法 一 理解进制含义 1 二进制 2 八进制 3 十进制 4 十六进制 二 进制之间转换 1 1二进制转十进制 1 2十进制转二进制 除法
  • java--基础--17.7--线程--内存模型与线程

    java 基础 17 7 线程 内存模型与线程 1 内存模型 1 1 主内存和工作内存之间的交互 1 2 对于 volatile 型变量的特殊规则 关键字 volatile 是 Java 虚拟机提供的最轻量级的同步机制 一个变量被定义为 v
  • 微信小程序设置背景图铺满顶部

    由于微信小程序自带顶部导航栏 导致我们设置背景图时总是无法铺满顶部 其实想要铺满顶部只需要改变一个属性即可 将navigationStyle的默认属性修改为custom 在微信小程序需要设置背景图的文件下的 json文件中设置
  • VxWorks的环境配置

    转载请标记出处 http blog csdn net zgh1988 article details 7994538 1 准备工作 1 VMWare 2 一台安装Windows XP或Window 7系统的PC机 3 Tornado 2 2
  • 进阶训练技巧提升模型性能

    在深度学习的世界中 训练技巧的重要性不言而喻 进阶训练技巧 包括损失函数 学习率 模型微调和半精度训练 更是对提升模型性能和准确率有着关键作用 下面我们将对这些技巧进行详细的探讨 一 损失函数 Loss Function 损失函数 或者叫作
  • 遍历map

    keySet是键的集合 Set里面的类型即key的类型 entrySet是 键 值 对的集合 Set里面的类型是Map Entry 1 keySet Map map new HashMap Iterator it map keySet it
  • 代码审计之JAVA代码审计洞态IAST系统以及SecExample靶场

    目录 2 JAVA系列代码审计 2 1 工具介绍 2 2 SecExample靶场安装 2 3 洞态IAST安装 2 3 洞态IAST使用 2 JAVA系列代码审计 之前我们都是采用代码审计工具对PHP代码进行审计 但是在实际的工作中对于从
  • unipush2.0教程

    解释一下名词 透传消息 无论手机app 是否在运行 打开了 还是清了后台 关闭 都可以收到消息 通知消息 只能app打开了 才能收到 1 开通unipush 2 点击上图的unipush2 0下面的配置 进入以下页面 选择平台 将其余项配置
  • tidb存储基本原理

    tidb是什么 tidb是分布式关系型数据库 需要从两个方面来理解tidb 分布式数据库 关系型数据库 什么是分布式系统 集中式系统 计算和存储在同一个节点上 分布式系统 计算和存储位于不同的节点上 分布式系统把需要进行大量计算的工程数据分
  • Unity3D持久化存储(一) PlayerPrefabs

    文章目录 PlayerPrefabs介绍 常用方法 存储数据 读取数据 查看数据 删除数据 PlayerPrefabs介绍 PlayerPrefabs是Unity内置的持久化存储类 可存储Float Int和String类型的数据 数据存储
  • AJAX传中文参数乱码问题解决

    当利用XMLHttpRequest提交中文数据到服务器端时候 ajax默认编码为utf8 提交中文会发生乱码 为了解决这个问题 baidu了一天 研究了一天 现在把这些心得写下来 以备忘 我这人健忘 首先明确一点 要想彻底没有乱码的烦恼 那
  • [论文阅读]《Database Maanagement Systems》-第三章

    第三章 THE RELATIONAL MODEL 关系模型 P75 P112 synopsis 概要 大纲 supplanted 代替 排挤掉 by far 到目前为止 Prototype relational database 原型关系数
  • Jetpack学习之Navigation

    Jetpack提供了一个名为Navigation的组件 用来管理页面 Actvity和Fragment 以Fragment为主 和App bar Navigation的优势 可视化的页面导航图 便于理清页面间的关系 通过destinatio
  • Java基础:Java的优点和缺点

    优点 1 跨平台 可移植性 是Java的核心优势之一 Java的运行是通过JVM来实现的 只需要在操作系统上安装对应的虚找机即可运行 节省代码重复编写时间 2 面向对象 Java是完全的面向对象语言 非常适合大型软件的设计和开发 3 简单性
  • 使用Vue调用后台接口

    最近在学习使用vue 看完调接口之后 立马使用springboot作为后台 跃跃欲试 很尴尬 刚刚写完一个后台 vue调用就出错了 1 跨域的问题 我还以为是需要的接口和我的接口不一致 后来知道并不是端口问题 解决办法 前台vue的调用地址
  • 利用script标签实现的跨域名AJAX请求(ExtJS)

    在AJAX应用环境中 由于安全的原因 浏览器不允许XMLHttpRequest组件请求跨域资源 在很多情况下 这个限制给我来带来的诸多不便 很多同行 研究了各种各样的解决方案 1 通过修改document domain和隐藏的IFrame来
  • Java中常见的异常总结,Exception如何捕获和处理

    什么是异常 异常机制 异常机制是指当程序出现错误后 程序如何处理 具体来说 异常机制提供了程序退出的安全通道 当出现错误后 程序执行的流程发生改变 程序的控制权转移到异常处理器 通俗一点来说 就是为了让程序不被中断 继续执行 程序错误 1