重新抛出异常:为什么该方法在没有 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 子句的情况下编译? 的相关文章

  • 为什么 Hashtable 不允许空键或空值?

    正如 JDK 文档中所指定的 Hashtable 不允许空键或空值 HashMap 允许一个空键和任意数量的空值 为什么是这样 Hashtable 是较旧的类 通常不鼓励使用它 也许他们看到了对 null 键的需要 更重要的是 null 值
  • 使用 TLS PSK 加密时如何正确检测流结束?

    我已经准备好了一个简单的 TLS PSK 客户端测试用例 https github com afarber jetty newbie tree master TlsPskClient2 src main java de afarber tl
  • 无法在 Intellij 中运行主类[重复]

    这个问题在这里已经有答案了 我有以下项目结构 ProjectRoot src Main examples libs My src文件夹被标记为sources在 Intellij 中 现在 当我想运行 Main 类时 出现以下错误 Excep
  • 如何杀死 Java Future?

    我正在开发的服务使用 Future 来并行运行多个任务 每个任务最多可能需要一分钟才能完成 然而 外部库似乎有问题 因为在某些情况下 2 的时间 它不会返回 在这些情况下 我想给出 2 分钟的等待时间 如果还没有返回 我想杀死 future
  • Java:一种将 Mime(内容)类型与 CommonsMultipartFile 中的文件扩展名相匹配的方法

    在我的公司 出于额外原因 我需要将 mime 类型与文件扩展名进行比较 我有一个CommonsMultipartFile 我正在尝试找出进行这种比较的最佳方法 我见过一个MimetypesFileTypeMap 但不确定这是否适用于此 我试
  • 传递自定义类型查询参数

    如何接受自定义类型查询参数 public String detail QueryParam request final MYRequest request 上面的行在启动服务器时出现错误 jersey server model ModelV
  • 使用 https 的 Web 服务身份验证给出错误

    我编写了一个简单的 Web 服务 并使用摘要和 HTTPS 身份验证来保护它 我已经使用 Java 中的 keytool 生成了我的证书 当我通过创建 war 文件在 Tomcat 中部署 Web 服务时 axis 的欢迎页面正确显示 但是
  • 当我们使用赋值而不是比较时,如何评估 if/while 条件?

    我在学习 Java 的 OCA OCP 时发现了这个令人惊讶的事情 下面是第一段代码 其中 if 测试条件 部分 让我惊讶 public class BooleanIf public static void main String args
  • Google 表格使用 API 密钥而不是 client_secret.json

    In the QuickStart java示例Java 快速入门 https developers google com sheets api quickstart java他们使用OAuth client ID识别该应用程序 这会弹出一
  • 在 doxygen 中使用 @see 或 @link

    我之前用 Javadoc 记录并使用了标签 see link or see foo and link foo 在我的描述中链接到其他课程 现在我尝试了doxygen 似乎这些标签不兼容 如果我运行 doxygen 完整的标签将被简单地解释为
  • java.exe 以非零退出值 1 结束

    只是为了开始 我并不是真正尝试从 Android 中的 xlsx 文件中读取单元格 我已经尝试了几乎所有我在 Google 上搜索到的内容 但是每次 在两台不同的 PC 上 都是 Java 1 7 0 79 当我尝试构建 运行 这个应用程序
  • 扩展多个类

    我知道 Java 不支持多重继承 因为不允许扩展多个类 我只是想知道我的问题是否有解决方法 我有一个名为CustomAction需要扩展两个抽象类 BaseAction and QuoteBaseAction 我无法更改这些抽象类中的任何一
  • 为休息服务实施 JUnit 测试

    我必须为我的休息服务实现一些 JUnit 测试 例如 这是我的休息服务之一 Path dni fe public class HelloWorld POST Path home Consumes MediaType APPLICATION
  • 始终将双精度舍入

    我怎么总是能把一个double to an int 并且永远不要将其四舍五入 我知道Math round double 但我希望它始终向上舍入 所以如果是的话3 2 四舍五入为 4 您可以使用Math ceil method 请参阅Java
  • 为 REST API 生成 Swagger UI 文档

    我使用 Java 中的 JAX RS Jersey 开发了 REST API 我想为其转换 生成基于 Swagger 的 UI 文档 谁能以简单的方式告诉我如何做到这一点的精确 步骤 很抱歉 他们网站上给出的步骤对我来说有点模糊 有多种方法
  • Java 8:如何创建毫秒、微秒或纳秒的 DateTimeFormatter?

    我需要创建格式化程序来解析具有可选的毫秒 微米或纳秒分数的时间戳 例如 对于我的需求 我看到以下机会 DateTimeFormatter formatter new DateTimeFormatterBuilder append DateT
  • Hybris:如何在impex中导入zip文件中的媒体?

    我知道我们可以导入未像这样压缩的图像 siteResource jar com project initialdata constants ProjectInitialDataConstants projectinitialdata imp
  • 亚马逊 Linux - 安装 openjdk-debuginfo?

    我试图使用jstack在 ec2 实例上amazon linux 所以我安装了openjdk devel包裹 sudo yum install java 1 7 0 openjdk devel x86 64 但是 jstack 引发了异常j
  • JPA ManyToMany 产生的空联接表

    我有一个应用程序 其中我尝试使用 Hibernate 作为 JPA 提供程序来实现两个实体之间的多对多关系 我正在尝试的例子是一个单向的 其中一个相机可以有多个镜头 而镜头可以安装到多个相机中 以下是我的实体类 只需粘贴其中的相关部分 Ca
  • MyBatis 枚举的使用

    我知道以前有人问过这个问题 但我无法根据迄今为止找到的信息实施解决方案 所以也许有人可以向我解释一下 我有一个表 状态 它有两列 id 和 name id是PK 我不想使用 POJO Status 而是使用枚举 我创建了这样一个枚举 如下所

随机推荐

  • 使用 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