用于异常的java条件运算符

时间:2013-05-02 09:40:20

标签: java

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?

4 个答案:

答案 0 :(得分:10)

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

这里有一个返回Exception的三元运算符。这可以是SQLExceptionIOException,但唯一常见的超类型是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语言规范有关于如何确定此表达式类型的规则。表达式的规则如下:

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

lubleast upper bound,在这种情况下,它会解析为Exception。由于catch没有Exception块,因此您的编译器会抱怨。

编译器抱怨

  

未处理的异常类型Exception

因为lubIOException的{​​{1}}(三元表达式的类型)是SQLException。编译器本质上是看到,例如

Exception