2017-11-04 146 views
0

好的抱歉如果我正在複製,但我真的看過網站,似乎沒有發現類似於我的問題的東西。或者至少它是爲其他人工作,但不適合我。「null」String .equals(「null」)返回false java(JOptionPane)

我的主要問題是我使用JOptionPane,並將結果存儲在一個字符串中。當關閉按鈕被點擊時,存儲在字符串中的值爲「null」,正如我在控制檯中注意到的那樣。

String addedItemName = (String)addItemPane.showInputDialog(null,"Select item to add to basket","Add Item",JOptionPane.QUESTION_MESSAGE,null,items,"Select Item"); 
System.out.println("added item : " + addedItemName); 

讓我這樣的結果在控制檯:

添加的項目:空

因此,我期待知道什麼時候被點擊了我的addedItemName比較字符串的關閉按鈕一個「空」字符串。 這似乎從來沒有工作,並相當挫折我,因爲我真的不明白。 以下是我爲了展示我如何嘗試每種不同方式而做出的一些其他測試,但它仍然無效。

 String nullString = "null"; 

     boolean test1 = Objects.equals(addedItemName, nullString); 
     boolean test2 = Objects.equals(nullString,addedItemName); 
     boolean test3 = nullString.equals(addedItemName); 
     boolean test4 = nullString.equalsIgnoreCase(addedItemName); 

     System.out.println(addedItemName); 
     System.out.println(nullString); 

     System.out.println(test1); 
     System.out.println(test2); 
     System.out.println(test3); 
     System.out.println(test4); 

用以下控制檯輸出,當我點擊關閉按鈕:

所以基本上,控制檯顯示我的addedItemName爲「null」點擊關閉按鈕時,但是當我把它比作一個「空」的字符串,它在某種程度上永遠是平等的。

感謝任何人會告訴我我是多麼愚蠢,爲什麼它不適合愚蠢的原因。

(也有點問題,但不知道這是否是重要的:平等的測試,即使字符串中獲得的價值回報NullPointerException異常錯誤的那些行)

boolean test1 = addedItemName.equals(nullString); 
    boolean test2 = addedItemName.equalsIgnoreCase(nullString); 

    System.out.println(addedItemName); 
    System.out.println(nullString); 

輸出:

null

線程「AWT-EventQueue-0」java.lang中的異常。NullPointerException異常

+3

'null'和'「null」'是完全不同的...... –

+0

null和「null」確實完全不同,但在我的情況下它只是「null」,因爲它們只是字符串而不是它們? @LouisWasserman –

+0

你是什麼意思,「他們只是字符串」?你可以有一個空的字符串,而不是「null」。 –

回答

3

空字符串必須是:

String nullString = null; 

原因 '空' 指的是未引用的對象(永遠銘記在Java是一種對象)

String nullString = "null"; 

是有效引用包含字母的字符串null 您的輸出有點混淆,導致

System.out.println("added item : " + null); 

結果在您看到的輸出中。這就是導致字符串concatination:

https://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.1.11

...現在需要考慮的唯一參考值。如果參考 爲空,則將其轉換爲字符串「null」(四個ASCII字符 n,u,l,l)。否則,執行轉換就好像通過 調用引用對象的toString方法而沒有參數 ;但如果調用toString方法的結果爲空,則使用 ,則使用字符串「null」。

+0

哇謝謝,這實際上真的很有幫助,超快,並讓我瞭解這個問題,除了解決它。 非常感謝,你搖滾! :) –