2014-04-09 18 views
0

在編譯模式下。null加零有時爲0,有時爲「nullnull」

String s1 = null; 
String s2 = null; 
s2 = s1 + s2; 
Window.alert("null + null = " + s2); 

結果:

"null + null = nullnull" 

但這段代碼:

public String getValue(DocListsInfo object) { 
    String s1 = object.getUrlForApplication(); 
    Window.alert("2: " + s1); 
    String s2 = object.getEodLink(); 
    Window.alert("3: " + s2); 
    String s3 = s1 + s2; 
    Window.alert("4: " + s3); 
    return s3; 
} 

=> 
// compiled javascript: 
function NUb(a){var b,c,d;b=a.q;$wnd.alert('2: '+b);c=a.g;$wnd.alert('3: '+c);d=b+c;$wnd.alert('4: '+d);return d} 

返回0,如果兩個getter方法返回null。

+0

getUrlForApplication()和getEodLink()方法的返回類型是什麼? – Braj

+0

都是字符串 – basin

+0

優化錯誤? – basin

回答

1

我對GWT編譯器的內部工作原理的瞭解非常有限,但我想我可能有一個想法是怎麼回事。

首先,這兩個片段有什麼區別?關於第一個細節的每個細節在編譯時已知(String s都是null),而我們對第二個細節知之甚少。如何在Java中使用null + null?這是nullnull可以閱讀here

但是,JavaScript中的null + null是什麼?這是0,你可以簡單地在你的瀏覽器中測試。


現在我想是怎麼回事是:讓我們先從你的第二個代碼段。它被編譯成JavaScript,然後JavaScript將確定s1s2基於object。然後它會嘗試添加/連接它們,結果爲0。好吧,沒關係,因爲這就是您使用JavaScript時所期望的(當然,如果您只是瞭解Java,那就不會那麼重要)。

第一個代碼片段(這裏是我的猜測)似乎通過編譯器的預處理/後處理步驟進行了優化(因爲我們已經知道它們都是null)。因此,所有JavaScript看到的(編譯器出來的)是一個常量。


也許別人可以對我猜的步驟有更多的瞭解。

+0

AFAIK,你猜對了。 –

相關問題