java异常.day31(异常处理机制)

Java的异常处理机制是一种强大的错误处理工具,它允许开发者在运行时捕获和处理异常情况。这种机制主要通过try, catch, finally, 和 throw 关键字来实现。

异常处理流程

  1. 抛出异常(Throwing an Exception)

    • 当程序遇到无法处理的错误时,它会创建一个异常对象并“抛出”该对象。这可以通过使用 throw 关键字来完成。

    • 开发者也可以在代码中显式地抛出异常,以指示某个方法不能继续执行。

  2. 捕获异常(Catching an Exception)

    • 使用 try 块来包围可能会抛出异常的代码。

    • 使用 catch 块来捕获并处理 try 块中抛出的异常。可以有多个 catch 块来捕获不同类型的异常。

  3. 最终处理(Finally Block)

    • finally 块包含的代码无论是否发生异常都会执行。这通常用于释放资源(如关闭文件或数据库连接)或其他清理工作。

  4. 异常传播(Exception Propagation)

    • 如果在 trycatch 块中不处理异常,异常会继续向上传播,直到被更上层的代码捕获或导致程序终止。

异常类

Java中的异常类都是 java.lang.Throwable 类的子类。Throwable 有两个主要的子类:java.lang.Errorjava.lang.Exception

  • Error:表示严重的问题,通常是由JVM或系统环境引起的,如OutOfMemoryError。这些错误是不可恢复的,通常不需要(也不应该)由应用程序代码来处理。

  • Exception:表示程序本身可以处理的问题,如逻辑错误或输入错误。这些异常可以被捕获并处理,以防止程序崩溃或提供用户友好的错误消息。

自定义异常

在Java中,自定义异常是通过创建一个新的类来实现的,这个新类通常继承自Exception类或其子类。自定义异常类允许你定义特定于应用程序的错误情况,并提供有关错误原因的详细信息。下面是一个简单的示例,展示了如何创建和使用自定义异常类:

首先,创建一个自定义异常类,继承自Exception类:

public class CustomException extends Exception {    
    public CustomException(String message) {        
        super(message);    
    }    
    // 可以添加其他构造函数或方法
}

在这个例子中,CustomException类只有一个构造函数,它接受一个字符串参数message,这个参数将用作异常的描述信息。

然后,你可以在你的代码中抛出这个自定义异常:

public class CustomExceptionExample {    
    public static void main(String[] args) {
        try {            
            // 调用可能抛出自定义异常的方法
            methodThatThrowsCustomException();        
        } catch (CustomException e) {            
            // 处理自定义异常           
            System.out.println("捕获到自定义异常: " + e.getMessage());        
        }    
    }    
    public static void methodThatThrowsCustomException() throws CustomException {        
        // 在某些条件下抛出自定义异常        
        if (true) { 
            // 这里是一个示例条件,实际中会是某些业务逻辑判断            
            throw new CustomException("这是一个自定义异常");        
        }        // 其他代码...    
    }
}

在这个例子中,methodThatThrowsCustomException方法在满足某个条件时抛出了CustomException。在main方法中,我们使用try-catch块来捕获并处理这个自定义异常。

methodThatThrowsCustomException方法抛出CustomException时,控制权将转移到catch块,其中打印出异常的描述信息。

自定义异常类可以包含更多的逻辑,比如添加额外的字段来存储关于异常的更多信息,或者定义额外的方法来进行错误处理等。这样做可以使异常处理更加灵活和强大。

请注意,如果自定义异常类继承自RuntimeException或其子类,那么它将成为一个未检查的异常,这意味着在调用它的方法时不需要显式地处理这个异常(即不需要在方法签名中使用throws关键字或在方法内部使用try-catch块)。然而,对于自定义异常,通常更推荐的做法是使其成为一个受检查的异常,这样可以让调用者更加明确地知道可能存在的错误情况,并相应地处理它们。

异常链(Exception Chaining)

Java允许通过构造异常对象时传递一个“cause”异常来创建异常链。这有助于追踪异常的根源。

异常规范(Exception Specification)

方法可以使用 throws 关键字来声明它可能抛出的异常类型。这称为方法的异常规范。调用该方法的代码必须处理或声明这些异常。

示例

public class ExceptionExample {    
    public static void main(String[] args) {        
        try {            
            int result = divide(10, 0); // 这将抛出一个ArithmeticException       
        } catch (ArithmeticException e) {            
            System.out.println("捕获到异常: " + e.getMessage());
            e.printStackTrace(); //打印错误的栈信息
        } finally {            
            System.out.println("最终块执行了");       
        }    
    }    
    
    public static int divide(int a, int b) throws ArithmeticException {       
        if (b == 0) {
            throw new ArithmeticException("除数不能为0");       
        }
        return a / b;    
    }
}

在这个示例中,divide 方法可能会抛出一个 ArithmeticException,因此在方法签名中使用了 throws 关键字。在 main 方法中,我们尝试调用 divide 方法并捕获可能抛出的异常。无论是否抛出异常,finally 块中的代码都会被执行。

throw关键字

throw关键字用于显式地抛出一个异常。当你使用throw关键字时,你正在创建一个新的异常对象并立即将其抛出。这通常发生在检测到一个错误条件时,例如,当方法不能继续执行其预期任务时。

下面是使用throw关键字的一个简单示例:

public class Example {    
    public static void main(String[] args) {        
        try {            
            checkAge(12);        
        } catch (IllegalArgumentException e){            
            System.out.println("捕获到异常: " + e.getMessage());        
        }    
    }    
    public static void checkAge(int age) throws IllegalArgumentException {        
        if (age < 18) {            
            throw new IllegalArgumentException("年龄必须大于或等于18");        
        }        
        System.out.println("年龄验证通过");    
    }
}

在这个例子中,checkAge方法检查年龄是否小于18。如果是,它使用throw关键字抛出一个IllegalArgumentException。在main方法中,我们使用try-catch块来捕获并处理这个异常。

throws关键字

throws关键字用于声明一个方法可能抛出的异常类型。它告诉方法的调用者,该方法可能会抛出一种或多种异常,因此调用者需要处理这些异常(使用try-catch块)或将其继续向上抛出(通过在方法签名中使用throws关键字)。

下面是使用throws关键字的一个简单示例:

public class Example {    
    public static void main(String[] args) {        
        try {            
            riskyOperation();        
        } catch (Exception e) {            
            System.out.println("捕获到异常: " + e.getMessage());        
        }    
    }    
    public static void riskyOperation() throws Exception {        //这里可以抛出任何类型的Exception或其子类
        throw new IOException("这是一个IO异常");    
    }
}

在这个例子中,riskyOperation方法声明它可能会抛出任何类型的Exception或其子类。因此,调用riskyOperationmain方法必须处理Exception,即使实际抛出的异常可能是Exception的一个特定类型(如IOException)。

区别

  • throw用于实际抛出异常对象。

  • throws用于声明方法可能抛出的异常类型,以便调用者知道需要处理这些异常。

使用规则

  • 如果一个方法内部使用throw抛出了异常,那么该方法的调用者必须处理这个异常(使用try-catch块)或声明它也可能抛出这个异常(使用throws关键字)。

  • 如果一个方法没有使用throw关键字抛出异常,但它的方法签名中使用了throws关键字声明了可能抛出的异常,那么这个方法本身不需要处理这些异常,但调用者必须处理它们。

总结

Java的异常处理机制为开发者提供了一个强大的工具来管理程序运行时的错误情况。通过正确地使用 try, catch, finally, 和 throw 关键字,以及创建自定义异常类,开发者可以编写更加健壮和可维护的代码。

try-catch快捷键:ctrl + alt + t

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/592291.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【5/01-5/03】 Arxiv安全类文章速览

知识星球 首先推荐一下我们的知识星球&#xff0c;以AI与安全结合作为主题&#xff0c;包括AI在安全上的应用和AI本身的安全&#xff1b; 加入星球你将获得&#xff1a; 【Ai4sec】&#xff1a;以数据驱动增强安全水位&#xff0c;涵盖内容包括&#xff1a;恶意软件分析&…

MATLAB中功率谱密度计算pwelch函数使用详解

MATLAB中功率谱密度计算pwelch函数使用详解 目录 前言 一、pwelch函数简介 二、pwelch函数参数说明 三、pxx pwelch(x)示例 四、[pxx,f]pwelch(x,window,noverlap,nfft,fs)示例 四、[pxx,f] pwelch(x,window,noverlap,nfft,fs,freqrange,spectrumtype)示例 五、多通道功…

# cmd 报错 “npm 不是内部或外部命令,也不是可运行的程序 或批处理文件”

cmd 报错 “npm 不是内部或外部命令,也不是可运行的程序 或批处理文件” 1、报错原因分析&#xff1a; Node.js 没有安装或安装不正确。 npm 的路径没有添加到系统环境变量中。 安装 Node.js 时选择了不包含 npm 的安装选项。 2、解决方法&#xff1a; 1&#xff09;在 cm…

【房屋】租房攻略,萌新第一次租房需要考虑的要素(通勤、地段、房源)

【房屋】租房攻略&#xff0c;萌新第一次租房需要考虑的要素&#xff08;通勤、地段、房源&#xff09; 文章目录 1、位置要好&#xff08;通勤近 vs 地段好&#xff09;2、户型要好&#xff08;朝向/楼层&#xff0c;独卫/家具&#xff0c;水电费&#xff09;3、价格要便宜4、…

Github 2024-05-03 Java开源项目日报 Top9

根据Github Trendings的统计,今日(2024-05-03统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目9Kotlin项目1C++项目1libGDX: 跨平台Java游戏开发框架 创建周期:4284 天开发语言:Java, C++协议类型:Apache License 2.0Star数量:2…

DDD:根据maven的脚手架archetype生成ddd多模块项目目录结构

随着领域驱动的兴起&#xff0c;很多人都想学习如何进行ddd的项目开发&#xff0c;那ddd的项目结构是怎么样的&#xff1f;又是如何结合SpringBoot呢&#xff1f;那么针对这个问题&#xff0c;笔者使用maven的archetype封装一个相对通用的ddd的项目目录&#xff0c;方便一键生成…

函数模板 template

函数模板的定义和调用 注意&#xff1a; 在调用函数模板时&#xff0c;编译器会根据调用的函数的参数类型自动推导出T的类型。 优先选择普通函数 强制调用函数模板 函数模板不能对函数的参数自动强制类型转换 myPrintAll(10,b)//普通函数&#xff0c;因为普通函数将b强制转换成…

安装vscode基础配置,es6基础语法,

https://code.visualstudio.com/ es6 定义变量 const声明常量&#xff08;只读变量&#xff09; // 1、声明之后不允许改变 const PI “3.1415926” PI 3 // TypeError: Assignment to constant variable. // 2、一但声明必须初始化&#xff0c;否则会报错 const MY_AGE /…

极简单行阅读器:上班族的摸鱼神器

在忙碌的工作日中&#xff0c;我们经常需要寻找一些方式来放松自己&#xff0c;而阅读无疑是一种既能够放松心情&#xff0c;又能增长知识的方式。今天&#xff0c;我要向大家介绍一个名为“极简单行阅读器”的神器&#xff0c;它不仅能够满足你的阅读需求&#xff0c;还能让你…

时也命也!反派失败于错估了主角的实力——早读(逆天打工人爬取热门微信文章解读)

此子断不可留 引言Python 代码第一篇 洞见 人到中年最大的清醒&#xff1a;时也&#xff0c;运也&#xff0c;命也第二篇 人民日报要闻社会政策 结尾 自知之明是最难得的知识 真正的智慧来自于对自己能力和局限的深刻理解 引言 最近在看仙葫 然后昨天晚上刷了一下这个诛仙 发现…

Qt之信号与槽

槽的本质&#xff1a;对信号响应的函数。 信号函数和槽函数通常位于某个类中&#xff0c;和普通的成员函数相⽐&#xff0c;它们的特别之处在于&#xff1a; 信号函数⽤ signals 关键字修饰&#xff0c;槽函数⽤ public slots、protected slots 或者 private slots 修饰。sign…

前端基础学习html-->表单标签

目录 表单标签&#xff1a; 表单域&#xff1a; 表单控件(表单元素)&#xff1a; 提示信息: 表单标签&#xff1a; 表单标签顾名思义就是一种表格&#xff0c;用于收集用户信息 在html&#xff0c;一个完整的表单域是由表单域&#xff0c;表单控件(表单元素)和提示信息组…

揭秘Fabric交易流程:一文带你深入了解

随着区块链技术的日益普及&#xff0c;Hyperledger Fabric作为一种联盟链解决方案&#xff0c;受到了广泛关注。那么&#xff0c;Fabric的交易流程究竟是怎样的呢&#xff1f;本文将为您一一揭晓。 1. Fabric交易的参与方 客户端&#xff1a;交易流程的发起方&#xff0c;发起…

Java web第五次作业

1.在idea中配置好数据源 2、视频案例中只给出了查询所有结果的示例&#xff0c;请自己完成添加、删除、修改操作的代码。以下供参 考。 Delete("delete from emp where id#{id}") public void delete(Integer id); 测试代码 Test public void testDelete(){ empMa…

springboot 整合 knife4j-openapi3

适用于&#xff1a;项目已使用shiro安全认证框架&#xff0c;整合knife4j-openapi3 1.引入依赖 <!-- knife4j-openapi3 --> <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-spring-boot-starter</artifa…

SpringBoot+Vue项目在线视频教育平台

一、前言介绍 本系统采用的数据库是Mysql&#xff0c;使用SpringBoot框架开发&#xff0c;运行环境使用Tomcat服务器&#xff0c;idea是本系统的开发平台。在设计过程中&#xff0c;充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面…

ThreeJS:常见几何体与基础材质入门

在前文《ThreeJS:Geometry与顶点|索引|面》中&#xff0c;我们了解了与Geometry几何体相关的基础概念&#xff0c;也尝试了如何通过BufferGeometry自定义几何体。 常见Geometry几何体 ThreeJS内部也提供了诸多封装好的几何体&#xff0c;常见的Geometry几何体如下图所示&#…

Delta lake with Java--利用spark sql操作数据1

今天要解决的问题是如何使用spark sql 建表&#xff0c;插入数据以及查询数据 1、建立一个类叫 DeltaLakeWithSparkSql1&#xff0c;具体代码如下&#xff0c;例子参考Delta Lake Up & Running第3章内容 import org.apache.spark.sql.SaveMode; import org.apache.spark.…

AGI要闻:斯坦福李飞飞首次创业,瞄准“空间智能”;OpenAI下周发布搜索产品挑战谷歌;新的开源 AI 眼镜来了|钛媒体AGI | 最新快讯

多方消息证实&#xff0c;OpenAI将会在北京时间5月10日&#xff08;周五&#xff09;凌晨2点公布搜索引擎新产品消息。 斯坦福大学首位红杉讲席教授 李飞飞 通用人工智能&#xff08;AGI&#xff09;领域又公布了一系列重磅消息。 5月4日凌晨&#xff0c;据路透社&#xff0c…

etcd源码流程---调试环境的搭建

etcd启动命令&#xff1a; name必须设置&#xff0c;否则会用default&#xff0c;集群内不同etcd实例的名字应该是唯一的&#xff0c;因为他会有一个map(name->ip)。如果initial-cluster-state设置为new&#xff0c;那么他会创建一个新的clusterid。需要在initial-cluster中…