Java如何在没有throws签名的函数中手动抛出异常

如果想在方法中抛出异常,像下面这样直接throw是不行的。

public void test() {
    throw new Exception();
}

这时编译器会给我们一个错误:

Error:(101, 13) java: 未报告的异常错误java.lang.Exception; 必须对其进行捕获或声明以便抛出


想要在方法中手动抛出异常,Java编译器给我们提供了两种选择,要么在方法签名中添加throws声明:

public void test() throws Exception {  
    throw new Exception();  
}

要么用try-catch封印:

public void test() {  
    try {  
        throw new Exception();  
    } catch (Exception e) {  
        e.printStackTrace();  
    }  
 }

对于第二种方法,除了语法正确外,屁用没有。


在一般情况下,或则只是为了解决未捕获异常错误,第一种方法已经足够。但是偏偏就有这么一种情况。当我们重写一个方法时,想在方法中抛出异常,但是方法签名中又没有throws声明。这就要了老命了,简直让人抓狂,大骂傻逼抓娃。

遇到这种情况也不是毫无办法,考虑下面的函数:

public static double sang(double a, double b) {  
    return a / b  
}  
​  
public static void main(String\[\] args) {  
    sang(1, 0);  
}

用1和0去调用上面的sang函数,铁定是要抛出异常的。奇怪的是它的方法签名中既没有throws声明,也没有try-catch封印,冥冥之中似乎透着那么丁点儿希望。

说到这里,如果你对Java异常分类有所了解的话,已经能从中窥探一二了。Java异常全部继承自Throwable,又分为ErrorExceptionError是运行时系统内部错误,编写应用程序很少涉及。Exception又有两个分支,分别是RuntimeExceptionCheckedException,这就是我们常听说的运行时异常和检测异常,而Java编译器强制必须捕获的就是检查异常。

我们在test函数中无法直接抛出异常正是因为被抛出的是一个检查异常,而double函数抛出的是运行时异常。所以解决方案也就呼之欲出了,只要将异常包装成运行时异常,就能骗过编译器,成功抛出异常了。

public void test() {  
    throw (RuntimeException)new Exception();  
}

当然,这里还要求调用test的函数能够捕获到运行时异常,否则抛出这个异常也就没有意义了。如果你是自己写函数调用test,那当然皆大欢喜,如果第三方代码库,那就只能祝好运了。

Image placeholder
學會做豬
未设置
  88人点赞

没有讨论,发表一下自己的看法吧

推荐文章
Go编程语言教程_1.1. 如何在Windows上安装Go?

先决条件:Go编程语言简介 之前,我们从在系统上安装Golang的过程开始。我们必须对Go语言是什么以及它实际上是什么有第一手的了解。Go是Google的RobertGriesemer,RobPike

AWS vs K8s 是新时代的 Windows vs Linux?

作者:IanMiell是开源程序员、演讲师、作家和博客写手以前……如果你与我一样,年过四十,又在IT行业工作,恐怕还记得每个人使用Windows,一小群但越来越多的人在业余时间埋头编译Linux的年代

聊聊chronos的pullFromDefaultCFAndPush

序本文主要研究一下chronos的pullFromDefaultCFAndPushpullFromDefaultCFAndPushDDMQ/carrera-chronos/src/main/java/

使用vue实现一个电子签名组件

使用vue实现一个电子签名组件在生活中我们使用到电子签名最多的地方可能就是银行了,每次都会让你留下大名。今天我们就要用vue实现一个电子签名的面板想要绘制图形,第一步想到的就是使用canvas标签,在

使用vue实现一个电子签名组件

在生活中我们使用到电子签名最多的地方可能就是银行了,每次都会让你留下大名。今天我们就要用vue实现一个电子签名的面板想要绘制图形,第一步想到的就是使用canvas标签,在之前的文章里我们使用canva

如何使用Vue构建Chrome扩展程序

浏览器扩展程序是可以修改和增强Web浏览器功能的小程序。它们可用于各种任务,例如阻止广告,管理密码,组织标签,改变网页的外观和行为等等。好消息是浏览器扩展并不难写。可以用你已经熟悉的Web技术(HTM

能直接下载了!微软最爽命令行工具登陆Windows 10,GitHub标星已破4万6

乾明发自凹非寺 转自量子位 |公众号QbitAI微软正式放出命令行工具WindowsTerminal。这个在发布之际就引得开发者大呼“WoW!Awesome!MyGod!”,甚至引得不少人当场表态买P

Java教程_在 Nashron 中使用 Backbone.js

这个例子展示了如何在Java8的NashronJavaScript引擎中使用Backbone.js模型。Nashron在2014年三月首次作为JavaSE8的一部分发布,并通过以原生方式在JVM上运行

笨办法学 Linux Bash:Shell、`.profile`、`.bashrc`、`.bash_history`

Bash:Shell、.profile、.bashrc、.bash_history。 当使用CLI(命令行界面)来使用Linux时,你正在与一个名为shell的程序进行交互。所有你输入的都传递给she

有了这8个Chrome扩展工具,Web开发事半功倍!

Chrome浏览器扩展程序,无论对开发人员还是设计人员来说,都是非常有用的,有些扩展程序会对开发工具的某类功能进行增强,也有一些会复制开发工具中的部分特性。从某种意义上来说,Chrome商店中的每个扩

死磕Synchronized底层实现,面试你还怕什么?

关于 synchronized 的底层实现,网上有很多文章了。但是很多文章要么作者根本没看代码,仅仅是根据网上其他文章总结、照搬而成,难免有些错误;要么很多点都是一笔带过,对于为什么这样实现没有一个说

聊聊chronos的BackupDB

序本文主要研究一下chronos的BackupDBBackupDBDDMQ/carrera-chronos/src/main/java/com/xiaojukeji/chronos/db/Backup

聊聊chronos的DeleteBgWorker

序本文主要研究一下chronos的DeleteBgWorkerDeleteBgWorkerDDMQ/carrera-chronos/src/main/java/com/xiaojukeji/chron

如何在浏览器中获取 Production Mode 的 React 实例

https://github.com/LiuuY/Blog...在ProductionMode下,React并没有暴露其实例。无论什么原因如果你要获取的话可以参考以下方法。条件浏览器安装了ReactD

深度复盘GitHub发展史:如何在短短10年内改变了人们的编程方式?

前不久,微软以75亿美元的价格收购GitHub,引发了科技行业的关注。在短短的10年内,GitHub改变了人们的编程方式。不仅让编程变得更简单,还改变了软件开发者对编程的看法。GitHub是如何做到的

python 处理多个异常

处理多个异常 我们可以使用三种方法来处理多个异常。 第一种方法需要把所有可能发生的异常放到一个元组里。像这样: try: file=open('test.txt','rb') except(IOErr

Python 异常处理笔记

什么是异常? 异常简单理解,就是非正常,没有达到预期目标。异常是一个事件,并且这个异常事件在我们程序员的运行过程中出现,会影响我们程序正常执行。 异常分两种: 1.语法错误导致的异常 2.逻辑错误

Python 异常处理笔记

什么是异常? 异常简单理解,就是非正常,没有达到预期目标。异常是一个事件,并且这个异常事件在我们程序员的运行过程中出现,会影响我们程序正常执行。 异常分两种: 1.语法错误导致的异常 2.逻辑错误

复杂异常检测如何快速落地?看看百度怎么做

作者简介:周伟  百度云高级研发工程师负责百度云智能运维(Noah)告警通告系统的设计和研发,在大规模分布式系统、运维监控、精准报警等方面具有广泛的实践经验。干货概览本文提到的异常检测(Anomaly

利用 samba 实现 Ubuntu18.04 与 Windows10 的文件共享

在Ubuntu18.04上安装samba服务 打开终端,使用下面指令安装samba服务。 $sudoaptinstallsamba $sudoaptinstallsmbclient 在Ubuntu1

微软停止与华为合作:Windows 暂停供应新订单

据《南华早报》消息,知情人士透露,在华为被列入美国黑名单、因而无法购买美国技术后,微软效仿谷歌的做法,停止接受华为的新订单。该知情人士表示,华为和微软之间的两大业务领域:笔记本电脑Windows操作系

韩国政府:放弃Windows 7,转投Linux

对于政府和企业而言,2020年4月是一个非常值得关注的时间,因为在这个时间,微软将会停止对Windows7的支持。正是只有不足一年的时间,很多政府和企业再次与微软合作,不过其中的花销相当高。韩国政府面

Kubernetes1.14 版发布,增强了云原生平台的Windows节点支持

Kubernetes1.14GA版本,是开源云原生平台Kubernetes在2019年的一次重大更新。自3月25日开始,这一版本正式推出,供开发者全面使用。  Kubernetes,由云原生计算基金会

windows利器使用与配置

1概述这篇文章主要讲述了一些windows下的"利器"级别工具的使用以及配置.2ListaryListary是一款强大的搜索工具,可以快速搜索过滤各种文件.下载地址.2.1基础配置右键进入配置选项,建

{