java未检查异常_Java中已检查和未检查的异常

java未检查异常

Java有两种类型的异常-已检查和未检查。 简而言之,选中的是指开发人员可以从异常中合理恢复的情况,而未选中的异常是无法处理的编程错误。 本文介绍了何时使用哪种。

但这不是那么简单–受检查的异常使代码变得“丑陋”。 它们迫使开发人员编写try / catch块或重新抛出异常。 但是重新抛出隐藏了另一个问题-一些异常不应跨越模块边界。 当您不知道要做什么时,被迫捕获受检查的异常时,最常见的操作是将其包装到RuntimeException中并重新抛出。

实际上,它可能不是最常见的-尤其是新手程序员倾向于吞下带有空catch块的异常。 如果存在一些用于异常处理的常规层,则日志和重新抛出有时会导致堆栈跟踪加倍。 无论如何,这里有多种不良做法,导致难以调试和维护的代码。

有人说,鉴于所引入的冗长,繁琐和容易出错,应该彻底消除检查异常。 C#根本没有检查过的异常。 当然,消除它们应该考虑向后兼容性。

但是,我认为拥有这两种例外的决定具有其优点。 它迫使开发人员认为在这种情况下可能会发生异常,因此他必须采取措施。 API声明它将抛出异常,并且开发人员将看到此编译时 。 它加强了编译时的安全性。 您不应该等到代码投入生产后才发现可能会失败。 Javadoc? 好吧,这是一个不错的选择,但是我敢打赌,直到异常发生之前,没有人会阅读javadoc。

那么,如何拥有“两全其美”呢? 我有一个怪异的想法( 请在此处详细说明 ),使API定义两个接口(通过继承链接,因此实际上仅支持一个接口),并提供一种通过工厂获得方法的方法,该实现的方法被检查异常,或者将检查的异常包装为未检查的异常。 我不知道这可能是可行的,也可能是愚蠢的。 现在,它看起来很奇怪。

但是以上只是一个解决方法。 然后另一个想法出现了–在方法上引入@RethrowExceptions批注。 它会告诉编译器,在此方法中,您不想处理已检查的异常,但也不想声明将其抛出。 (注释的名称可以改进)。 在我想到的最简单的实现中,这可以简单地告诉编译器使用try {..} catch (Exception ex) { throw new RuntimeException(ex);}包围整个方法主体。 好处:

  • 编译器仍然警告您所使用的方法可能会引发异常,因此您必须考虑处理它
  • 通过不必要的尝试/捕获,您不会使代码变得丑陋。 而且您不会强迫呼叫者考虑如何处理例外情况
  • 吞下异常的可能性降低了。

简而言之,这样的注释会将方法标记为无法处理异常并且不希望将此决定传播给其调用方的方法。

这个想法听起来不那么奇怪。 我猜它甚至可以使用编译器插件来实现。 也许它已经在lombok项目中实现了?

别忘了分享!

参考: Bozho的技术博客博客中的JCG合作伙伴 Bozhidar Bozhanov提供的 Java中的Checked和Unchecked异常 。


翻译自: https://www.javacodegeeks.com/2012/09/checked-and-unchecked-exceptions-in-java.html

java未检查异常

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python清空列表clear_如何在Python中清空列表?

似乎很“肮脏”以这种方式清空列表:while len(alist) > 0 : alist.pop()是否存在明确的方法?#1楼list []将list重置为空列表。请注意,通常您不应list_保留的函数名称,例如list ,它是列表对象的构造函数-例如&#…

linux shell 自定义函数(定义、返回值、变量作用域)介绍

linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。下面说说它的定义方法,以及调用需要注意那些事项。 一、定义shell函数(define function) 语法: [ function ] funname [()] { action; [return int;] } 说明: …

Lintcode--6(767)--翻转数组

1、题目描述原地反转给定的数组&#xff0c;原地意味着你不能使用额外的空间。 2、AC程序 &#xff08;1&#xff09;利用C自带的函数 class Solution { public:void reverseArray(vector<int> &nums) {reverse(nums.begin(),nums.end());} }; &#xff08;2&#xf…

CPU时间分片、多线程、并发和并行

1、CPU时间分片、多线程&#xff1f; 如果线程数不多于CPU核心数&#xff0c;会把各个线程都分配一个核心&#xff0c;不需分片&#xff0c;而当线程数多于CPU核心数时才会分片。 2、并发和并行的区别 并发&#xff1a;当有多个线程在操作时,如果系统只有一个CPU,把CPU运行时间…

如何在Java中实现线程池

线程是独立程序的执行路径。 在java中&#xff0c;每个线程都扩展java.lang.Thread类或实现java.lang.Runnable。 多线程是指在一个任务中同时执行两个或多个线程。在多线程中&#xff0c;每个任务可以具有多个线程&#xff0c;并且这些线程可以异步或同步地并行运行。 您可以…

html选择按键点击后锁死输入框_js实现的键盘开启大写锁定提示和密码显示与隐藏的效果...

不知道大家注意到没有&#xff0c;很多人性话的网站再输入密码的时候&#xff0c;如果开启大写锁定下过(切换键A左边的Cap Lock按键)&#xff0c;那么就会给出一个提示&#xff0c;因为很多时候密码验证是区分大小写的&#xff0c;如果不小心开启或者关闭大小写就有可能导致输入…

vim ctags使用方法

windows下很多人都使用source insight 编写和查看代码。linux下可以使用VIM&#xff0c;刚开始会觉得VIM像windows下的记事本&#xff0c;而如果使用得当&#xff0c;它并不比source insight 逊色。在这里&#xff0c;我会尽我所能细致地讲清楚如何把vim变成source insight, 然…

MATLAB读取txt文件的数据

常用的主要有以下几种方法&#xff1a; 1、loadData load("filename.txt");该函数只能加载仅含有数字的文本文件&#xff0c;如果文档中夹杂着字母或者文字&#xff0c;就会报错。 2、importdataData importdata("filename.txt");既可以读取数据又可以读…

谷歌guava_Google Guava v07范例

谷歌guava我们在TouK举办了一个名为“每周技术研讨会”的活动&#xff0c;即每个星期五的16:00&#xff0c;每个愿意参加的人都有一个演讲。 我们展示了我们在家学习和学习的东西&#xff0c;但是我们还设有一个公告板&#xff0c;上面有人们想听的话题。 上周MaciejPrchniak谈…

arduinoesp8266定时器_ESP8266深度睡眠与Arduino IDE(NodeMCU)

本指南展示了如何使用Arduino IDE与ESP8266(NodeMCU)一起使用深度睡眠。我们将使用定时器唤醒来唤醒深度睡眠&#xff0c;并使用复位(RST)引脚来唤醒外部唤醒。引入深度睡眠模式如果您使用电池供电的ESP8266板制作了一个项目&#xff0c;或者只是将ESP8266 NodeMCU板连接到了移…

MATLAB对图片格式批量转换

从网上下载一些数据集&#xff0c;发现是PPM或者PGM格式的&#xff0c;一般照片查看器打不开。可以用MATLAB对其进行批量转换格式。当然&#xff0c;任何两种格式之间相互转换都可以用这个程序&#xff1a;% 本示例程序将 pgm 图片转换为 jpg 图片 % 如果仅对一张 pgm 图片作…

gunicorn部署Flask服务

作为一个Python选手&#xff0c;工作中需要的一些服务接口一般会用Flask来开发。 Flask非常容易上手&#xff0c;它自带的app.run(host"0.0.0.0", port7001)用来调试非常方便&#xff0c;但是用于生产环境无论是处理高并发还是鲁棒性都有所欠缺&#xff0c;一般会配合…

linux shell 中判断字符串为空的正确方法

help命令可以查看帮助 help test 正确做法&#xff1a; #!/bin/sh STRING if [ -z "$STRING" ]; then echo "STRING is empty" fi if [ -n "$STRING" ]; then echo "STRING is not empty" fi rootjames-desktop:~#…

打开wmware没反应_没呼吸没脉搏,溺水女孩危在旦夕!预产期只差9天的她挺着大肚子出手相助...

8月9日晚上8点半南海桂城中海锦城小区游泳池一位小女孩溺水了&#xff01;脸色青紫、嘴唇发绀没有呼吸也没有脉搏情况非常不妙&#xff01;↓↓↓救生员立马给女孩做心肺复苏。站在泳池边陪女儿才游不到200米的南海医院妇科医生胡碧洪&#xff0c;听见泳池边的骚动&#xff0c;…

使用JAXB的简介

我正在将一些依赖于Apache XMLBeans的模块迁移到JAXB。 这是令人兴奋且充满挑战的几天。 我想记下我遇到的一些重要事情&#xff0c;以供将来可能会发现有用的任何人使用。 首先&#xff0c;让我们来看一下设置用于JAXB代码生成的maven插件。 在撰写本文时&#xff0c;我遇到了…

关于opencv读取摄像头的未解之谜

前段时间做项目需要用opencv读usb摄像头的视频数据&#xff0c;遇到很多无解的问题&#xff0c;虽然后来没有用到&#xff0c;但是还是记录下来&#xff0c;也许以后就知道答案了呢。 1、无论摄像头的实际分辨率是多少&#xff0c;opencv读进来的视频分辨率都是640*480大小的&a…

[BZOJ2834]回家的路

Description Input Output Sample Input 2 1 1 2 1 1 2 2Sample Output 5思路还是很简单的&#xff0c;然而最短路打错各种对拍各种调了一早上代码&#xff1a;1 #include<iostream>2 #include<cstdio>3 #include<cstring>4 #include<vector>5 #includ…

dubbo优势_Dubbo与SpringCloud核心组件Ribbon、Hystrix、Feign的优劣势比较

在微服务架构中&#xff0c;分布式通信、分布式事务、分布式锁等问题是亟待解决的几个重要问题。Spring Cloud是一套完整的微服务解决方案&#xff0c;基于 Spring Boot 框架。确切的说&#xff0c;Spring Cloud是一个大容器(而不是一个框架)&#xff0c;它可以将通过集成一些好…

使用Java更新DynamoDB项

在上一篇文章中&#xff0c;我们继续使用Java将项目插入DynamoDB。 DynamoDB还支持更新项目。 我们将使用Login表获取更新示例。 发布更新时&#xff0c;必须指定要更新的项目的主键。 public void updateName(String email,String fullName) {Map<String,AttributeValue…

Python执行系统命令的方法 os.system(),os.popen(),commands

最近在做那个测试框架的时候发现 Python 的另一个获得系统执行命令的返回值和输出的类。 最开始的时候用 Python 学会了 os.system() 这个方法是很多比如 C&#xff0c;Perl 相似的。 os.system(cat /proc/cpuinfo) 但是这样是无法获得到输出和返回值的&#xff0c;继续 Goog…