Checked vs UnChecked 异常 ,使用场合异常的概念

Java异常类型深度解析:Checked vs. Unchecked 在 Java 中,检查型异常(Checked Exceptions)是指所有不继承自或Error的Exception子类。根据《Java 语言规范》,这类异常必须在编译期被显式处理——要么用try-catch捕获,要么在方法签名中通过throws声明,否则代码无法通过编译。检查型异常代表程序无法控制但可预期的外部风险,例如文件不存在、网络中断或数据解析失败。典型的例子包括和。throw new FileNotFoundException("配置文件读取失败: " + path);此处。 阅读详情

异常的概念  

       任何的异常都是Throwable类(为何不是接口??),并且在它之下包含两个字类Error / Exception,而Error仅在当在Java虚拟机中发生动态连接失败或其它的定位失败的时候,Java虚拟机抛出一个Error对象。典型的简易程序不捕获或抛出Errors对象,你可能永远不会遇到需要实例化Error的应用,那就让我们关心一下Exception。

       Exception中比较重要的就是RuntimeException(运行时异常)-可能在执行方法期间抛出但未被捕获的 RuntimeException 的任何子类都无需在 throws 子句中进行声明,也就是说你的应用应该不去“关心”(说不关心是不服责任的,但只是你不应该试图实例化它的字类)。  RuntimeException,就如同你不应该关心Error的产生与处理一样!RuntimeException描述的是程序的错误引起来的,因该由程序负担这个责任!(从责任这个角度看Error属于JVM需要负担的责任;RuntimeException是程序应该负担的责任;checked exception 是具体应用负担的责任)

       除了Error与RuntimeException,其他剩下的异常都是你需要关心的,而这些异常类统称为Checked Exception,至于Error与RuntimeException则被统称为Unchecked Exception.

         关于 Java 中引入的 Checked Exceptions,目前存在着很多反对意见。正方的观点是引入 Checked Exceptions,可以增加程度的鲁棒性。反方的观点是 Checked Exceptions 很少被开发人员正确使用过,并且降低了程序开发的生产率和代码的执行效率。

Java 中定义了两类异常: 

1) Checked exception: 这类异常都是Exception的子类 。异常的向上抛出机制进行处理,如果子类可能产生A异常,那么在父类中也必须throws A异常。可能导致的问题:代码效率低,耦合度过高。C#中就没有使用这种异常机制。

2) Unchecked exception: 这类异常都是RuntimeException的子类,虽然RuntimeException同样也是Exception的子类,但是它们是特殊的,它们不能通过client code来试图解决,所以称为Unchecked exception 。  

   

(JAVA视线论坛robbin's view,个人觉得用来做业务流程控制违背了Exception设计的初衷,但可以借鉴一下)

     在使用UseCase来描述一个场景的时候,有一个主事件流和n个异常流。异常流可能发生在主事件流的过程,而try语句里面实现的是主事件流,而catch里面实现的是异常流,在这里Exception不代表程序出现了异常或者错误,Exception只是面向对象化的业务逻辑控制方法。如果没有明白这一点,那么我认为并没有真正明白应该怎么使用Java来正确的编程。 
      而我自己写的程序,会自定义大量的Exception类,所有这些Exception类都不意味着程序出现了异常或者错误,只是代表非主事件流的发生的,用来进行那些分支流程的流程控制的。例如你往权限系统中增加一个用户,应该定义1个异常类,UserExistedException,抛出这个异常不代表你插入动作失败,只说明你碰到一个分支流程,留待后面的catch中来处理这个分支流程。传统的程序员会写一个if else来处理,而一个合格的OOP程序员应该有意识的使用try catch 方式来区分主事件流和n个分支流程的处理,通过try catch,而不是if else来从代码上把不同的事件流隔离开来进行分别的代码撰写。

(另外一种观点,不同于robbin,个人赞同,并引用于此)

1。什么时候抛出异常--涉及到服务类
2。抛出checked还是unchecked的异常--涉及到客户类

       对第一个问题来说,我想异常本身这个字解释了某些东西,异常就是我们认为在正常情况下不可能发生的问题,并且服务代码不知道如何去处理。譬如说我做一个监控程序,需要用压缩卡提供的API去初始化所有的板卡,API提供的是boolean型的返回值,但我把这个API变成抛出一个异常,因为除非特殊原因,我不认为会发生初始化失败的情况,当然更不知道怎样去处理这个问题。又譬如Hibernate里面的LoadObject使用没有发现这个对象存在,那Hibernate也是认为不可能的,除非其他代码直接删除了数据库里面的记录,那么也需要抛出异常。当然Hibernate本身也不知道如何处理这种情况。
       但是如果发生的情况是可以预期的,那我不认为应该抛出例外。象上面这个userExist的情况,我认为应该在前面已经分流,应该首先判断这个用户是否存在,if(userExists()),然后进行处理,而不应当抛出例外。以及login应当返回true或者false。也就是说,这些属于程序的正常流程,而不是例外,不是异常。把例外作为正常程序流程的控制机制,只不过是把服务代码中的if转移到客户代码去,没有减少任何需要处理的代码,反而增加了系统的负担(生成例外栈)。
       还有抛出异常的情况是违反方法的先决条件,每一个方法都有自己的先决条件和后置条件,方法只有在正确的前提下才能执行达到一个正确的后果,(所谓类的不变量)。譬如你去存取一个数组的某一个元素,这个存取方法有一个前提条件,就是你的索引应当落入它的最大下标和最小下标之间,不然就应当抛出一个例外。

         对于第二个问题,端视于客户代码是否能够根据这个例外进行合理的处理。如果客户代码根本就不知道如何处理这个例外,应当把它作为一个unchecked例外,例如上面下标的问题,客户代码用一个不合法的下标来存取数组,那么抛出一个checked例外以后,客户代码是+1还是-1?显然根本就不可能做出“合理的”处理,客户既然不能处理,还要强制它去处理,那么就是捕获,打印了事,没有增加任何价值。但是如果是客户可以处理的,或者可以选择不同的方式处理的,那么就可能需要用checked,但我发现很少有这样的情况。对于类似于RemoteException或者SQLException这些Exception,我一般都转换为具体的业务Exception,而我所有的业务Exception都是RuntimeException.

         所以我的观点是,是否抛出例外就是服务代码是否进行合理的处理,抛出什么类型的例外就是客户代码是否能够合理的处理。

保护封装性的代码实例:

      不要让你要抛出的checked exception升级到较高的层次。例如,不要让SQLException延伸到业务层。业务层并不需要(不关心?)SQLException。你有两种方法来解决这种问题:

 1)转变SQLException为另外一个checked exception,如果客户端并不需要恢复这种异常的话;
 2)转变SQLException为一个unchecked exception,如果客户端对这种异常无能为力的话;

      多数情况下,客户端代码都是对SQLException无能为力的,因此你要毫不犹豫的把它转变为一个unchecked exception,看看下边的代码:

public void dataAccessCode(){
try{
      .  .some code that throws SQLException
}catch(SQLException ex){
     ex.printStacktrace();
}
}

       上边的catch块紧紧打印异常信息而没有任何的直接操作,这是情有可原的,因为对于SQLException你还奢望客户端做些什么呢?(但是显然这种就象什么事情都没发生一样的做法是不可取的)那么有没有另外一种更加可行的方法呢? 看下面代码:
public void dataAccessCode(){
try{
     ..some code that throws SQLException
}catch(SQLException ex){
    throw new RuntimeException(ex);
}
}
     上边的做法是把SQLException转换为RuntimeException,一旦SQLException被抛出,那么程序将抛出RuntimeException,此时程序被挂起并返回客户端异常信息。 调用该方法的程序代码中也不用再捕获SQLException异常:

public void do(){

     dataAccessCode();   
}

MFC实现键盘钩子(附完整源码) 阅读详情

相关推荐

GD32H7实战:5步搞定YOLO轻量化模型部署到MCU(附避坑指南)

本文详细介绍了如何将YOLO轻量化模型部署到GD32H7 MCU的完整实战流程。通过五个关键步骤,涵盖环境搭建、模型训练、格式转换到工程集成,并重点分享了使用GD32AI-ModelZoo工具链进行MCU部署的避坑指南,帮助开发者在资源受限的边缘设备上实现高效目标检测。

weixin_29070861的博客 446

Checked vs UnChecked Exception ,使用场合?

 Checked vs UnChecked 异常 ,使用场合?异常的概念          任何的异常都是Throwable类(为何不是接口??),并且在它之下包含两个字类Error / Exception,而Error仅在当在Java虚拟机中发生动态连接失败或其它的定位失败的时候,Java虚拟机抛出一个Error对象。典型的简易程序不捕获或抛出Errors对象,你可能永远不会遇到需要

2035

Redis+Unity 数据库搭建

游戏中需要存放排行榜等数据,而且是实时存放,所以就涉及到数据库的问题。这里找服务器大神了解到可以用Redis来做存储,免费的效率极高。

chaixinke的专栏 879

aop (spring 事物对于unchecked可以回滚,但是对于checked例外不回滚)

cn.itcast.bean [java] view plaincopy package cn.itcast.bean;      public class Person {       private Integer id;       private String name;       public Integer get

longyuan20102011的专栏 1188

海思Hi3519AV100 sensor移植实战:IMX586驱动调试与硬件验证全流程

本文详细解析了在海思Hi3519AV100平台上移植索尼IMX586传感器的全流程实战。内容涵盖从硬件I2C通信验证、驱动代码移植与修改,到内核配置、时钟设定,以及使用示波器进行硬件信号深度验证和ISP图像调优等关键步骤,为开发者提供了一套清晰、可复现的sensor移植与调试方法。

weixin_29168393的博客 395

杂货店商品数据集挖掘关联规则实验

(2)选择事务集中前100条事务,选择合适的支持度阈值,使用Apriori算法和FP-growth算法挖掘频繁项集(推荐使用mlxtend包的apriori和fpgrowth函数),并对比apriori算法和fpgrowth算法的时间复杂度;(比如用户1000在2015年3月15日对应的事务为{‘sausage’,’whole milk’,’semi-finished bread’,’yogurt’}),然后按照用户ID递增,时间递增的方式对事务进行排序;7. 排版工整自洽,图表标题准确(10分)

m0_62500122的博客 1441

Java异常:选择Checked Exception还是Unchecked Exception?

Java包含两种异常:checked异常和unchecked异常。C#只有unchecked异常。checked和unchecked异常之间的区别是: Checked异常必须被显式地捕获或者传递,如Basic try-catch-finally Exception Handling一文中所说。而unchecked异常则可以不必捕获或抛出。 Checked异常继承java.lang.Exce...

数据库 844

SAP S4业务伙伴(BP)实战指南:从角色分配到数据同步的完整流程

本文详细解析了SAP S4业务伙伴(BP)功能,从基础概念到实战操作,涵盖角色分配、数据同步及常见问题排查。通过BP机制,企业可高效管理客户、供应商等多重身份,实现数据共享和动态切换,显著提升主数据管理效率。特别适合SAP实施顾问和ERP管理员参考。

y2z3a4b5c的博客 870

详解Java中的checked异常和unchecked异常

Java中checked和unchecked异常的区分,以及java的异常层次结构,应该对哪些异常进行声明。

在地图上飞行 4万+

静态代码审计插件 snyk 使用教程

静态代码审计插件 snyk 使用教程

SHELLCODE_8BIT的博客 2005

解决Windows 11文件右键菜单卡死问题的方法

当你右键点击一个文件或者文件夹时,系统会加载与该文件类型相关的上下文菜单项,如果其中某个菜单项的代码执行时间过长或者出现错误,就会导致整个右键菜单卡死。综上所述,当你在Windows 11中遇到右键菜单卡死的问题时,你可以尝试禁用上下文菜单项、重置文件关联、排除第三方软件干扰、修复系统文件以及优化代码等方法来解决问题。如果你是一个开发者,并且你自己编写了一个上下文菜单项,那么问题可能出在你的代码中。例如,如果你遇到了图片文件的右键菜单卡死问题,你可以找到".jpg"或".png"等相关的子项。

HnrzLinux的博客 7536

Java中的checked异常和unchecked异常

(一)Java的异常层次结构   要想明白Java中checked Exception和unchecked Exception的区别,我们首先来看一下Java的异常层次结构。   这是一个简化的Java异常层次结构示意图,需要注意的是所有的类都是从Throwable继承而来,下一层则分为两个结构,Error和Exception。其中Error类层次描述了Java运行时系统的内部错误和资源耗尽...

voodoo的博客 1万+

【异常】‘build.plugins.plugin.version‘ for org.apache.maven.plugins:maven-resources-plugin is missing

maven-compiler-plugin 插件版本信息没有指定导致了错误提示如下字面意思就是没有指定版本信息。

奶爸的编程之路,也就一周冷个三天 4599

异常处理艺术:Checked vs Unchecked异常设计哲学

想象一下,你正在写一个程序读取文件,结果文件被隔壁老王删了;或者你调用了一个方法,结果参数传成了null。这些“翻车现场”就是异常!Java用异常机制让程序在翻车时优雅地喊一句:“老司机带带我!”而不是直接崩溃。

qq_37502042的博客 926

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java 异常体系(Checked vs. Unchecked)

在 Java 中,异常是指在程序执行过程中出现的错误或意外情况。Java 的异常体系是一个类层次结构,所有异常类都继承自Throwable类。ThrowableError和Exception。Error:表示系统级的错误,通常是由 Java 虚拟机(JVM)本身的问题引起的,如等。这类错误通常是不可恢复的,程序员一般无法通过代码进行处理。Exception:表示程序可以处理的异常情况。它又可以分为两种类型:Checked 异常和 Unchecked 异常。

dsq_MaDing的博客 1085

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Java 中 Checked 和 Unchecked 异常的区别与自定义异常实现

Java 的异常类继承自Throwable,分为Error和ExceptionError:表示严重问题(如),通常不可恢复,程序不应捕获。Exception:分为 Checked 和 Unchecked 异常。基类子类Checked 异常在编译时强制处理,适合外部资源操作;Unchecked 异常运行时触发,适合逻辑错误。自定义异常通过继承Exception或,携带上下文信息,提升语义化。电商支付系统案例验证了 P99 延迟 3ms、QPS 12 万的效果。选择。

lssffy的博客 1213

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

《Java异常机制底层原理:checked vs unchecked、栈轨迹优化技巧》

摘要:Java异常机制是错误处理的重要工具,但滥用会导致性能问题和代码混乱。文章深入剖析了checked与unchecked异常的本质区别,揭示了JVM异常处理的底层原理(异常表机制),并通过JMH测试证明异常抛出比错误码慢700倍。重点提供了栈轨迹优化三大技巧:重写fillInStackTrace、日志框架过滤和按需生成堆栈,可减少90%日志量。最佳实践建议:核心路径使用轻量异常、精准捕获具体异常、避免异常控制流,实现性能与可维护性的平衡。异常处理决策树帮助开发者在不同场景做出合理选择。

qq_43414012的博客 676

Checked vs UnChecked 异常

<br /> Checked vs UnChecked 异常 ,使用场合?<br /><br />异常的概念   <br />       任何的异常都是Throwable类(为何不是接口??),并且在它之下包含两个字类Error / Exception,而Error仅在当在Java虚拟机中发生动态连接失败或其它的定位失败的时候,Java虚拟机抛出一个Error对象。典型的简易程序不捕获或抛出Errors对象,你可能永远不会遇到需要实例化Error的应用,那就让我们关心一下Exception。<br /> 

ocean1010的专栏 1271

java 异常选择: Checked Exception VS Unchecked Exception

Checked Exception 设计的初衷是为了从异常情况恢复,Checked Exception 假使我们捕获了异常,然后需要恢复程序 Unchecked Exception 运行时异常,类似 NullPointerException、ArrayIndexOutOfBoundsException ,通常是编码可以避免的逻辑错误,不可恢复 Checked Exception VS Unchecked Exception 支持 Checked Exception 编译器强制检查,Checked Exce

qq_14957991的博客 369

Java异常体系:Checked vs Unchecked 的设计哲学

Error 代表 JVM 层面的严重错误,比如 StackOverflowError 和 OutOfMemoryError,这类问题程序员基本无能为力,程序能做的最多就是感知到并优雅退出,通常不推荐捕获。这类异常代表「预期内的异常路径」,调用者有明确的应对策略,强制处理是合理的。Java 的 Checked Exception 是语言设计史上一个大胆的实验,出发点是好的——希望强制开发者正视错误、不能忽略。但在实践中,它的局限性也很明显:过度强制导致开发者绕过它,破坏封装,影响代码的可维护性。

hello world! 99

Checked vs UnChecked 异常 ,使用场合?

Checked vs UnChecked 异常 ,使用场合?   异常的概念          任何的异常都是Throwable类(为何不是接口??),并且在它之下包含两个字类Error / Exception,而Error仅在当在Java虚拟机中发生动态连接失败或其它的定位失败的时候,Java虚拟机抛出一个Error对象。典型的简易程序不捕获或抛出Errors对象,你可能永远不会遇到需要...

130

C#学习——语法——checked unchecked 关键字

checked 和 unchecked关键字用来限定检查或者不检查数学运算溢出的

937

Checked and Unchecked Exceptions in Java

Checked exceptions: exceptions that are checked at compile time. 所以需要在方法上throws异常,或者用try-catch来处理异常,不然编译器会报错。Checked exceptions表示在正常work flow之外的错误。 // throws keyword private static void checkedExceptionWithThrows() throws FileNotFoundException { File f

jzhong720的博客 184

[转]Checked vs UnChecked 异常 ,使用场合?

异常的概念          任何的异常都是Throwable类(为何不是接口??),并且在它之下包含两个字类Error / Exception,而Error仅在当在Java虚拟机中发生动态连接失败或其它的定位失败的时候,Java虚拟机抛出一个Error对象。典型的简易程序不捕获或抛出Errors对象,你可能永远不会遇到需要实例化Error的应用,那就让我们关心一下Exception。  

Java 是用来喝的 510
上一篇: 利用comet实现服务器推式的通信
下一篇: 使用ibatis实现动态分页查询
ProjectArchitect
博客等级 码龄19年 3粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值