2016-04-14 38 views
-3

我有2個例子:差異然後在Java中

void terminate(String x) { 
    System.exit(0); 
} 

void x (long y) { 
if(y == null) { 
    terminate(); 
} 
//code 
} 
..... 
x(null); //Don't want that 

這個例子似乎工作。我想確保long y不是null。我可能會這樣做:

void x (long y) throws NullPointerException { 
//code 
} 
... 
try { 
x(null); 
} catch (NullPointerException e) { 
e.printstacktrace(); 
} 

性能差異是什麼?在這樣的例子中,它可能不可見,但在一個複雜的程序中,它會起作用嗎?我是否應該實踐異常而不是如果呢?

+5

'long'不能爲'null'。 – rgettman

+3

請勿使用'System.exit' – SLaks

+2

實際上,您的代碼已經可以保護您免受'null'! 「長」不能爲空。 – eckes

回答

2

使用例外例外的情況下,當事情發生,你不期望和沒有什麼明智的可以做到恢復。

否則,請使用if-then並可能返回狀態碼。

就性能而言,異常會產生比回報更大的開銷。調用一個方法並捕獲一個異常,如果它不起作用是冗長而煩人的。

void myOperation() { 
    step1(); 
    step2(); 
    step3(); 
} 

在這個例子中,例外的是優選的,當任何步驟失敗,則整個操作反正失敗,所以我不想不必處理的任何現象。

void myOperation(String number) { 
    int n; 
    try { 
     n = Integer.parse(number); 
    } catch (NumberFormatException e) { 
     n = DEFAULT; 
    } 
    doThings(n); 
} 

在這種情況下,必須捕捉異常是煩人的,因爲我期望字符串是無效的,並有一個合理的選擇。異常使代碼變得緩慢而冗長。

+0

我非常不同意檢查異常是必須的。必須檢查每個返回以查看它是否爲空是更糟糕的。我寧願一個方法拋出一個異常,而不是返回一個空對象。代碼是,恕我直言,更容易閱讀,沒有一堆'if(obj == null){//保留無論如何}'結構。 – KevinO

+0

@KevinO我添加了一個清晰的例子。 – Cephalopod

0

表現差異是什麼?

具有例外的版本肯定會工作得更慢,並且會有處理異常,創建對象,填充堆棧跟蹤等的開銷。

在這樣的例子中,它可能不可見,但在一個複雜的程序中, 會很重要嗎?我是否應該實踐異常而不是如果呢?

在複雜的程序沒有使用這種處理可能的空指針異常,它實際上是一個Java反模式,所以如果你whant是保存NULL,則應你有種不爲null檢查一樣,如果(X! = null)或斷言。

另外我建議你閱讀更多關於java中的異常和checked/unchecked exceptions之間的區別等等。

PS here是關於空檢查的好主題。