簡體   English   中英

用於異常的java條件運算符

[英]java conditional operator for exceptions

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?

是的,遺憾的是,編譯器無法確定您是否可以拋出這兩個異常中的一個(並且語言規范不要求它)。

你在這里有一個返回Exception的三元運算符。 這可以是SQLExceptionIOException ,但唯一常見的超類型是Exception ,因此編譯器將在此處看到。

Java中沒有“聯合類型”。

與此案例相同:

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

這里, x也必須是一個Object ,因為沒有其他類型來表達Integer || String Integer || String

這很好, ?:運算符對任何boolean值都做同樣的事情。

你的synatx是無效的。你可以做這樣的事情。

Exception ex = true ? new IOException(): new Exception();
throw ex;

這個

b ? new E1() : new E2()

是一個引用條件表達式 Java語言規范有關於如何確定此表達式類型的規則。 表達式的規則如下:

  • 否則,第二和第三操作數分別是S1S2類型。 T1是將拳擊轉換應用於S1產生的類型,讓T2為應用到S2裝箱轉換所產生的類型。 條件表達式的類型是將捕獲轉換(第5.1.10節)應用於lub(T1, T2)

lub最小上限 ,在這種情況下,它解析為Exception 由於您沒有Exceptioncatch塊,您的編譯器會抱怨。


編譯器在抱怨

未處理的異常類型Exception

因為IOExceptionSQLExceptionlub (三元表達式的類型)是Exception 例如,編譯器基本上是在看

private static void testThrow2(final boolean flag) throws IOException, SQLException { 
                                                   // this won't compile
    throw (Exception) new IOException("IO"); 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM