2010-04-27 49 views
6

我在Prototype.js中編寫了很多代碼,如果未找到DOM-id,它將返回null。在JavaScript中捕獲「NullPointerExceptions」

$("someId").show(); 

如果someId不存在,方法將被要求空,它停止整個程序,實際上禁用錯誤畢竟JS效果。我可以在執行這樣的語句之前檢查null,但這會讓人很累。

我想抓住一個例外,但我不確定它是哪一個。 MDC列出了以下ECMA腳本錯誤類型,但乍一看他們都不是我想要什麼:

* Error 
* EvalError 
* RangeError 
* ReferenceError 
* SyntaxError 
* TypeError 
* URIError 
* DOMException 
* EventException 
* RangeException 

另外,不要瀏覽器有應付一個空的方法調用的一種統一的方式?

+5

*我可以在執行這樣的語句之前檢查null,但這會變得累人。*咦?你是否是開發者?使用檢查編寫健壯的代碼是一種正常且良好的做法。 – BalusC 2010-04-27 12:40:04

+0

好點,但如果子句使得我的代碼真的不可讀,則會重複嵌套。我應該說,而不是'累人'。 – 2010-04-27 12:54:31

+0

接受答案,如果它爲你工作 – 2010-07-27 06:33:26

回答

0

,請忽略它是例外...

try 
{ 
    null.hey() 
} 
catch(e) 
{ 
    //handle it here 
} 
2

我不相信有被發現的統一。 Chrome會拋出一個TypeError,但是IE會拋出一個錯誤,所以你可能必須抓住一切並做出嚴重的假設。最好先檢查null。

var element = $('someId'); 
if (element) { 
    element.show(); 
    // whatever else... 
} 

如果element.show()是你需要它的唯一的事情,那麼它顯然可以寫短了很多,但是這將是合適的大多數情況下。

1

如果你要連鎖。 show()$("someId")然後檢查其結果第一。

if ($("someId")) 
    $("someId").show(); 

or 

$("someId") && $("someId").show(); 

or 

if (someVar = $("someId")) 
    someVar.show(); 

如果由於某種原因,你真的需要找出他們,你可以換$(),並引發自定義異常:

function NullReferenceException(id) {this.id = id} 

function $my(id) { 
    var el = $(id); 
    if (!el) 
     throw new NullReferenceException(id); 
    return el 
} 

try { 
    $my("iDontExistId").show(); 
} catch (e) { 
    if (e instanceof NullReferenceException) 
     alert(e.id + " doesn't exist"); 
} 
1

來處理這個正確的方法是做某件事之前要檢查空與一個對象。有幾個速記方法可以做到這一點,最短的是(亞歷克斯K)寫道

$("someId") && $("someId").show(); 

但是這在我看來是難以閱讀。

直接回答你的問題,你可以做

try { $('someId').show(); } catch (e) {} 

但這似乎業餘。你應該明確編程,因爲稍後別人不會知道你爲什麼寫這個奇怪的代碼。第一個示例稍微不透明,但至少包含null測試,並且不會隱藏show()方法中的錯誤。

順便說一句,如果你使用JQuery,而非原型,這個代碼將沒有錯誤工作,即使沒有與id的對象someId「:

$('#someId').show() 

這是因爲在JQuery中返回$()函數一個可能爲空的集合,但永遠不會爲null。

+0

我意識到這一點,但我的老闆堅持原型。我喜歡,但這個問題實際上是非常流行的。 – 2010-04-28 08:28:58

+0

+1提到如何在jQuery中工作。 – 2013-04-17 16:30:20