private static int testReturn(final boolean flag) {
return flag ? 1 : 2;
}
private static void testThrow1(final boolean flag)
throws IOException, SQLException {
if (flag ) {
throw new IOException("IO");
} else {
throw new SQLException("SQL");
}
}
当我尝试使用?:
运算符更改
private static void testThrow2(final boolean flag)
throws
//IOException, SQLException, // not even required
Exception { // compiler wants this.
throw flag ? new IOException("IO") : new SQLException("SQL");
}
这是正常的吗?
谢意
当我准备Java 7功能的演示文稿时,我实际上遇到了这个代码,例如multiple-catch和typed rethrowal。有趣。谢谢大家的好消息。我学到了很多东西。
更新
Java 7已针对特定类型的重新抛出进行了改进,对吗?
void throwIoOrSql() throws IOException, SQLException {
}
void rethrowIoAndSql() throws IOException, SQLException {
try {
throwIoOrSql();
} catch (Exception e) {
throw e; // Ok with Java 7
}
}
编译器无法看到那些明显的情况,这有些愚蠢。
throw flag ? new IOException("io") : new SQLException("sql"); // obvious, isn't it?
答案 0 :(得分:10)
是的,遗憾的是,编译器无法确定您是否可以抛出这两个异常中的一个(并且语言规范不要求它)。
这里有一个返回Exception
的三元运算符。这可以是SQLException
或IOException
,但唯一常见的超类型是Exception
,这就是编译器将在此处看到的内容。
Java中没有“联合类型”。
与本案相同:
Object x = flag ? Integer.valueOf(1) : "a string";
此处,x
也必须是Object
,因为没有其他类型可以表达Integer || String
。
答案 1 :(得分:0)
这非常好,?:
运算符对任何boolean
值执行相同的操作。
答案 2 :(得分:0)
您的synatx无效。您可以做这样的事情。
Exception ex = true ? new IOException(): new Exception();
throw ex;
答案 3 :(得分:-1)
此
b ? new E1() : new E2()
是reference conditional expression。 Java语言规范有关于如何确定此表达式类型的规则。表达式的规则如下:
- 否则,第二个和第三个操作数分别为
S1
和S2
类型。让T1
成为应用装箱所产生的类型 转换为S1
,让T2
成为应用产生的类型 拳击转换为S2
。条件表达式的类型是 将捕获转换(第5.1.10节)应用于lub(T1, T2)
的结果。
lub
为least upper bound,在这种情况下,它会解析为Exception
。由于catch
没有Exception
块,因此您的编译器会抱怨。
编译器抱怨
未处理的异常类型
Exception
因为lub
和IOException
的{{1}}(三元表达式的类型)是SQLException
。编译器本质上是看到,例如
Exception