3
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 功能(例如多捕获和类型化重新抛出)准备演示文稿时遇到了这段代码。有趣的。谢谢大家的这些好答案。我学到了很多。

更新

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?
4

4 回答 4

10

是的,不幸的是,编译器无法确定您可以抛出这两个异常之一(并且语言规范并不要求它)。

您在这里拥有的是一个三元运算符,它返回一个Exception. 这可以是SQLExceptionor IOException,但唯一常见的超类型是Exception,所以这就是编译器将在这里看到的。

Java 中没有“联合类型”。

与本例相同:

 Object x = flag ? Integer.valueOf(1) : "a string";

在这里,x也必须是一个Object,因为没有其他类型可以表达Integer || String

于 2013-05-02T09:43:42.363 回答
0

这很好,操作员对任何价值?:都做同样的事情。boolean

于 2013-05-02T09:42:58.313 回答
0

您的 synatx 无效。您可以执行以下操作。

Exception ex = true ? new IOException(): new Exception();
throw ex;
于 2013-05-02T09:47:00.000 回答
-1

b ? new E1() : new E2()

是一个参考条件表达式。Java 语言规范有关于如何确定这个表达式的类型的规则。你的表达规则是这样的:

  • 否则,第二个和第三个操作数分别是 和S1类型S2。设T1为 应用装箱转换产生的类型,S1设为 应用装箱转换T2产生的类型S2。条件表达式的类型是将捕获转换(第 5.1.10 节)应用于lub(T1, T2).

lub最小上限,在这种情况下,它解析为Exception. 由于您没有catchfor 块Exception,因此您的编译器会抱怨。


编译器抱怨

未处理的异常类型Exception

因为and的lub(那个三元表达式的类型)是。例如,编译器本质上是看到IOExceptionSQLExceptionException

private static void testThrow2(final boolean flag) throws IOException, SQLException { 
                                                   // this won't compile
    throw (Exception) new IOException("IO"); 
}
于 2017-08-21T18:31:43.280 回答