2016-01-17 445 views
9

javac爲什麼不會在這段代碼上發出錯誤?爲什麼java允許NPE

private static int compute(int v) { 
    return v == 0 ? null : v; 
} 

當然,compute(0)會丟NullPointerException。我希望Java編譯器,以防止這種情況做一些基本的靜態代碼分析,就像它會阻止

private static int compute(int v) { 
    if (v == 0) 
     return null; 
    else 
     return v; 
} 

回答

5

爲什麼java的允許NPE?

要指示例外條件(並允許程序員潛在恢復)。

在您的示例中,Java允許使用autoboxingunboxingnullint裝箱到Integer(然後將拆箱裝箱到int)。

+2

哦,我明白了。 'v == 0? null:v'誘導Integer類型,它會欺騙編譯器。我仍然認爲這很愚蠢。 – milan

+0

這是爲什麼使用三元運算符通常被一些人認爲是不好的做法的一個原因。許多新開發的Java開發人員都認爲它是一種減少實際冗餘的機會,這是一種很難找到漏洞的好方法。 – CheeseFerret