[英]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
的三元運算符。 這可以是SQLException
或IOException
,但唯一常見的超類型是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語言規范有關於如何確定此表達式類型的規則。 表達式的規則如下:
- 否則,第二和第三操作數分別是
S1
和S2
類型。 設T1
是將拳擊轉換應用於S1
產生的類型,讓T2
為應用到S2
裝箱轉換所產生的類型。 條件表達式的類型是將捕獲轉換(第5.1.10節)應用於lub(T1, T2)
。
lub
是最小上限 ,在這種情況下,它解析為Exception
。 由於您沒有Exception
的catch
塊,您的編譯器會抱怨。
編譯器在抱怨
未處理的異常類型
Exception
因為IOException
和SQLException
的lub
(三元表達式的類型)是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.