重新抛出异常:为什么该方法在没有 throws 子句的情况下编译?

2023-12-14

在下面的源代码中我重新抛出一个Exception.
为什么没有必要把throws方法签名上的关键字?

public void throwsOrNotThrowsThatsTheQuestion() {
    try {

        // Any processing

    } catch (Exception e) {
        throw e;
    }
}

此行为似乎仅发生在 Java 1.7 上。当使用 1.6 进行编译时,我收到以下编译器错误消息:

c:\dev\src\misc>javac -source 1.6 Main.java
warning: [options] bootstrap class path not set in conjunction with -source 1.6
Main.java:22: error: unreported exception Exception; must be caught or declared
to be thrown
        throw e;
        ^
1 error
1 warning

但在 Java 1.7 中,它可以编译。

c:\dev\src\misc>javac -source 1.7 Main.java

c:\dev\src\misc>

...直到我真正抛出一个Exception in the try block:

public static void throwsOrNotThrowsThatsTheQuestion() {
try {

    // Any processing
    throw new IOException("Fake!");

} catch (Exception e) {
    throw e;
}

正在编译...

c:\dev\src\misc>javac -source 1.7 Main.java
Main.java:22: error: unreported exception IOException; must be caught or declare
d to be thrown
        throw e;
        ^
1 error

看起来 Java 1.7 已经足够聪明,可以检测到这种类型Exception(s) 可能会通过分析抛出try块代码,如 1.6 刚刚看到的throw e;类型的Exception并为此给出了一个错误。

将其更改为抛出RuntimeException使其按预期编译,因为一如既往,未经检查Exception不需要throws clause:

public static void throwsOrNotThrowsThatsTheQuestion() {
try {

    // Any processing
    throw new RuntimeException("Fake!");

} catch (Exception e) {
    throw e;
}

正在编译...

c:\dev\src\misc>javac -source 1.7 Main.java

c:\dev\src\misc>

说明

这是发生的事情:

Java 7 推出更具包容性的类型检查。引用...

考虑以下示例:

static class FirstException extends Exception { }
static class SecondException extends Exception { }

public void rethrowException(String exceptionName) throws Exception {
  try {
    if (exceptionName.equals("First")) {
      throw new FirstException();
    } else {
      throw new SecondException();
    }
  } catch (Exception e) {
    throw e;
  }
}

此示例的 try 块可能会抛出 FirstException 或 SecondException。假设您要在 rethrowException 方法声明的 throws 子句中指定这些异常类型。在 Java SE 7 之前的版本中,您不能这样做。因为catch子句的异常参数e是Exception类型,并且catch块重新抛出异常参数e,所以只能在rethrowException方法声明的throws子句中指定异常类型Exception。

然而,在 Java SE 7 中,您可以在 rethrowException 方法声明的 throws 子句中指定异常类型 FirstException 和 SecondException。 Java SE 7 编译器可以确定语句 throw e 抛出的异常一定来自于 try 块,而 try 块抛出的异常只能是 FirstException 和 SecondException。即使 catch 子句的异常参数 e 是 Exception 类型,编译器也可以确定它是 FirstException 或 SecondException 的实例:

(强调我的)

public void rethrowException(String exceptionName)
throws FirstException, SecondException {
  try {
    // ...
  }
  catch (Exception e) {
    throw e;
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重新抛出异常:为什么该方法在没有 throws 子句的情况下编译? 的相关文章

  • 使用 LinkedList 实现下一个和上一个按钮

    这可能是一个愚蠢的问题 但我很难思考清楚 我编写了一个使用 LinkedList 来移动加载的 MIDI 乐器的方法 我想制作一个下一个和一个上一个按钮 以便每次单击该按钮时都会遍历 LinkedList 如果我硬编码itr next or
  • Pig Udf 显示结果

    我是 Pig 的新手 我用 Java 编写了一个 udf 并且包含了一个 System out println 其中的声明 我必须知道在 Pig 中运行时该语句在哪里打印 假设你的UDF 扩展了 EvalFunc 您可以使用从返回的 Log
  • 如何获取之前的URL?

    我需要调用我的网络应用程序的 URL 例如 如果有一个从 stackoverflow com 到我的网站 foo com 的链接 我需要 Web 应用程序 托管 bean 中的 stackoverflow 链接 感谢所有帮助 谢谢 并不总是
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • 从最终实体获取根证书和中间证书

    作为密码学的菜鸟 我每天都会偶然发现一些简单的事情 今天只是那些日子之一 我想用 bouncy castle 库验证 java 中的 smime 消息 我想我几乎已经弄清楚了 但此时的问题是 PKIXparameters 对象的构建 假设我
  • 无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]-MySQL

    我是 Hibernate 的新手 我目前正在使用 Spring boot 框架并尝试通过 hibernate 创建数据库表 我知道以前也问过同样的问题 但我似乎无法根据我的环境找出如何修复错误 休眠配置文件
  • 将 MOXy 设置为 JAXB 提供程序,而在同一包中没有属性文件

    我正在尝试使用 MOXy 作为我的 JAXB 提供程序 以便将内容编组 解组到 XML JSON 中 我创建了 jaxb properties 文件 内容如下 javax xml bind context factory org eclip
  • 在 junit 测试中获取 javax.lang.model.element.Element 类

    我想测试我的实用程序类 ElementUtils 但我不知道如何将类作为元素获取 在 AnnotationProcessors 中 我使用以下代码获取元素 Set
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • 如何使用 jUnit 将测试用例添加到套件中?

    我有 2 个测试类 都扩展了TestCase 每个类都包含一堆针对我的程序运行的单独测试 如何将这两个类 以及它们拥有的所有测试 作为同一套件的一部分执行 我正在使用 jUnit 4 8 在 jUnit4 中你有这样的东西 RunWith
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • Cucumber 0.4.3 (cuke4duke) 与 java + maven gem 问题

    我最近开始为 Cucumber 安装一个示例项目 并尝试使用 maven java 运行它 我遵循了这个指南 http www goodercode com wp using cucumber tests with maven and ja
  • Android:无法使用 DbHelper 和 Contract 类将数据插入 SQLite

    public class Main2Activity extends AppCompatActivity private EditText editText1 editText2 editText3 editText4 private Bu
  • 找不到符号 NOTIFICATION_SERVICE?

    package com test app import android app Notification import android app NotificationManager import android app PendingIn
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp

随机推荐

  • 使用 Webinator+Selenium、SpecFlow 和 NUnit 进行多浏览器测试

    我正在使用 Selenium 驱动程序使用 WebinatorSpecFlow NUnit 开发 ASP NET MVC 3 应用程序 我在使用 Chrome 使用 chromedriver 和 Internet Explorer 运行并行
  • JavaScript:需要函数将包含二进制的字符串转换为十六进制,然后转换回二进制

    假设我有一个 JavaScript 字符串 其中包含二进制数据 它可能看起来像这样 var binary 00001000010001000101010100001110 我需要一些可靠的函数将其转换为十六进制字符串 然后再次从该十六进制转
  • javaws 退出代码真的被破坏了吗?

    我正在努力使用 JNLP 自动执行相同的 java 代码 我惊讶地发现 jamaws 没有给我一个有效的返回代码 原来的执行行是 javaws wait http example com 666 missing jnlp 这确实显示了一个丑
  • Angular 2 Http.get 没有响应

    我正在使用 Http get 检索配置文件 我已经成功做过很多次了 但这次却一无所获 我在控制台中没有看到跟踪 也没有看到错误 即使我使用的是 catch 我这里可能有什么问题 this http get assets dashboard
  • 如何使用 python selenium 在 React-Select Component 下拉列表中选择值?

    selenium 和 HTML 非常新 我想从网站中选择一个下拉列表 这type被隐藏 我只想通过或选择其中之一male or female从下拉列表中或将其传递到value变量 我该怎么做 我使用 Chrome 中的检查元素来确定下面的两
  • 角度单选按钮:选中

    在简单的 html 和 css 中 我可以执行以下操作 input checked label background color f00 div class col xs 6 div
  • NSNumber 与 NSArray 的原始 int

    我正在使用 Mac OSX 版 Cocoa 编程 第四版来学习 Objective C Cocoa 我对这个基本问题表示歉意 但我是那些真正需要了解一切事物内部结构才能对我有意义的人之一 而这本书并不总是能满足我的需求 我已经学习了 C 的
  • 对视图的显示进行动画处理

    我在视图上添加了一个按钮 视图与按钮大小相同 单击该按钮时 必须显示一个新视图 因此 在按钮的事件处理程序中 我将 newview 添加为添加按钮的视图的子视图 以便在单击按钮时显示 newview 我需要做的事情是 当我单击按钮时 必须从
  • Git:合并错误,然后恢复合并。现在无法再次合并分支

    我在 git 方面遇到了一点麻烦 这就是我所做的 我将最新的 master 合并到我的分支并推送它 后来意识到这个合并已损坏并恢复了合并 现在我正在尝试再次合并master 它说它是最新的 我能知道如何强制将 master 的所有更改合并到
  • AtomicInteger 的 getAndIncrement 实现

    AtomicInteger 的 getAndIncrement 实现执行以下操作 public final int getAndIncrement for int current get Step 1 get returns the vol
  • 保存 UITextField 测试的最佳方法:textFieldShouldReturn 或 textFieldDidEndEditing

    我的目标只是在用户单击键盘上的完成按钮后将文本保存在 UITextField 上 我可以在 extFieldShouldReturn 或 textFieldDidEndEditing 中执行此操作 有什么区别吗 还是有更好的方法 Thank
  • USB 调制解调器回显错误的字符

    我在 ttyACM0 端口上连接了 USB 调制解调器 当我打开 Minicom 之类的应用程序并尝试向其发送一些命令时 回显并不总是我输入的内容 例如 如果我输入 A 则会得到 如果我输入 T 我就会得到 T 串行端口似乎正在剥离我的传输
  • 如何使用 VBA 将图像嵌入到 Outlook 电子邮件中

    非常密切相关在outlook邮件正文中嵌入图片excel vba 我正在尝试将图像嵌入到 Outlook 电子邮件中 我正在使用以下代码片段 其中一半是从上面的帖子中窃取的 Sub PictureEmail Dim outApp As Ne
  • 只有一个 TRUE 复选框

    我有一列复选框 如果选中一个框 它将为另一个工作表中的单元格设置一个值 如果我选中 1 号框 它就会变为 true 而其余的仍然为 false 然后 如果我选中 2 号框 它也会随着 1 号框而变为 true 而其余的仍然为 false 这
  • DocuSign 认证的严格性

    来自 DocuSign API 要求信息 Y 我们的 API 认证审核涉及验证您是否每 15 分钟每个唯一信封的状态请求不超过 1 个 以便对以下方法进行轮询合规性 REST API GET accounts accountId envel
  • Windows 窗体中的多个用户

    我正在做一个项目 我需要一些实施想法 到目前为止我使用的是Windows 窗体 该应用程序将由同一台电脑上的不同用户使用 我不是一个善于交际的人 所以我会给你一个场景 1 该应用程序首先显示一个登录表单 2 用户 John 进入应用程序并通
  • 如何解决 JetBrains WebStorm“未解析的变量 webServ”警告?

    我正在利用WebStorm集成开发环境对于 Node js 开发 我正在尝试清除所有 WebStorm 警告和错误 剩下的错误是 未解析的变量 webServ 警告 但 req params webServ 的使用是正确的 我不想只删除 W
  • 如何在 C# 中将默认的 FlushMode 更改为 Commit?

    所以 已经说过了 如何改变FlushMode to Commit in C 我的意思是 在 Fluent NHibernate 中 FlushMode 默认设置为 Auto 所以 将 FluentMode 设置为Commit 我需要打开会话
  • 如何验证 JasperReports 中的空报表?

    我的情况是 当我无法通过查询检索 jasper 文件中的任何内容时 仍然会生成报告 我正在使用这行代码来生成报告 ByteArrayOutputStream baos new ByteArrayOutputStream JasperPrin
  • 重新抛出异常:为什么该方法在没有 throws 子句的情况下编译?

    在下面的源代码中我重新抛出一个Exception 为什么没有必要把throws方法签名上的关键字 public void throwsOrNotThrowsThatsTheQuestion try Any processing catch