- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
在下面的源代码中,我正在重新抛出 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>
...直到我在 try
block 中实际抛出 Exception
:
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 已经足够智能,可以通过分析 try
block 代码来检测可能引发的 Exception
(s) 类型,而 1.6 刚刚看到throw e;
类型 Exception
并为此给出错误。
将其更改为抛出 RuntimeException
使其按预期编译,因为与往常一样,未经检查的 Exception
不需要 throws
子句:
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 引入 more inclusive type checking .引用...
Consider the following example:
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;
}
}
This examples's try block could throw either FirstException or SecondException. Suppose you want to specify these exception types in the throws clause of the rethrowException method declaration. In releases prior to Java SE 7, you cannot do so. Because the exception parameter of the catch clause, e, is type Exception, and the catch block rethrows the exception parameter e, you can only specify the exception type Exception in the throws clause of the rethrowException method declaration.
However, in Java SE 7, you can specify the exception types FirstException and SecondException in the throws clause in the rethrowException method declaration. The Java SE 7 compiler can determine that the exception thrown by the statement throw e must have come from the try block, and the only exceptions thrown by the try block can be FirstException and SecondException. Even though the exception parameter of the catch clause, e, is type Exception, the compiler can determine that it is an instance of either FirstException or SecondException:
(强调我的)
public void rethrowException(String exceptionName)
throws FirstException, SecondException {
try {
// ...
}
catch (Exception e) {
throw e;
}
}
关于java - 重新抛出异常 : Why does the method compile without a throws clause?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19913834/
MySQL 首先执行什么:WHERE 子句还是ORDER BY 子句? 我问的原因是确定我是否应该为给定的列添加索引。 我有如下表格: | Column | Type | Inde
如果您要在 SQL 查询中连接多个表,您认为将连接语句放在什么地方比较好:在 FROM 子句或 WHERE 子句中? 如果您打算在 FROM 子句中执行它,您如何格式化它以使其清晰易读? (我说的是一
mysql新版本与only_full_group_by的问题 我需要使用 Group by (col_id) 和 order by (date) 获取表值我在 mysql 中的代码如下: SELECT
获取异常: With-clause referenced two different from-clause elements 使用以下实体执行以下查询时: @Entity public class
我已经编写查询以从作为表 tbl_states 的主键的 tbl_summer 表中获取状态为事件的不同 stateID。 我想要按字母顺序列出不同的州名。实际上我是从以下查询中得到的,但字母顺序没有
我试图找出以下 2 个查询之间的区别 查询 1: 其中我在子句中给出了条件 'Orders.OrderID != null' SELECT Customers.CustomerName, Orders
我有两个模型: const User = sequelize.define('User', { email: { type: DataTypes.STRING, },
我正在尝试在我的 JPA 存储库之一中使用内部联接进行选择 查询: @Query(value = "select wm.WagerIdentification, wm.BoardNumber, wm.
我正在尝试从表中获取记录总数并使用以下 MySQL 查询: SELECT COUNT(*) AS cnt FROM `info` WHERE 1 GROUP BY FROM_UNIXTIME(sign
我开始使用 Hibernate 并且我正在使用 HQL,使用一些连接从数据库中检索数据但是出现此错误,感谢任何有关如何解决此问题的帮助。 Field.hbm.xml 文件:
使用Finish语句的代码和不使用Finally语句的代码之间有什么不同?。这对于没有Finish语句的代码来说,它们看起来是一样的。有什么不同吗,比如表现还是什么?。这是我从那个网站得到的流程图。在
在 Redshift 上输入以下查询时,我收到“错误:带有 ORDER BY 子句的聚合窗口函数需要框架子句”消息。请帮助 - 我正在尝试查看成员从第一天到今天的成长情况。谢谢。 select dat
我正在为此编写一个查询: select * from players where player_name like '%K% and player_rank 1; 现在,函数 check_if_p
我有 3 个 SQL 查询: 从 user_id =4 的用户中选择 student_id;//返回 35 select * from student where student_id in (35)
我有这样一个 xml: nota1 nota2 nota3 nota4 nota1
我一直试图找出错误,我正在做一种编程语言并有下一个代码,使用 ragg,我有一个语法对象(resto ...),它有一个括号作为数据,我转换这个语法对象到一个数据: (let ([i (synt
我正在尝试在 MS SQL Server 上连接 2 个或更多表。所有表都有确定事件记录的 IsActive 字段。 (IsActive = 1 表示事件记录,IsActive = 0 表示非事件记录
有人可以指导我修复此查询中的错误吗: var objApps = from item in xDoc.Descendants("VHost")
我在 MySQL 中遇到错误:错误代码:1054。“on 子句”中的未知列“s.Product_id” 出现在: SELECT c.customer_ID, p.Product_id, p.Produ
我正在尝试运行一个使用 WHERE 子句从表中选择值的查询,该查询只返回所有条件都有值的行,我是否要返回同样为空的值? Language Table
我是一名优秀的程序员,十分优秀!