好的抱歉,如果我正在复制,但我真的浏览了网站,似乎没有找到与我的问题类似的东西。或者至少它适用于其他人但不适合我。
我的主要问题是我使用了JOptionPane,并将结果存储在String中。单击关闭按钮时,存储在字符串中的值为“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);
在控制台中获取此结果:
添加项目:null
因此,我想知道何时通过将我的addedItemName字符串与“null”字符串进行比较来点击关闭按钮。 这似乎永远不会奏效,而且让我感到非常沮丧,因为我并没有真正理解它。 以下是我做的其他一些测试,以展示我尝试的每种不同的方式,但它仍然不起作用。
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”,但是当我将它与“null”字符串进行比较时,它在某种程度上永远不会相等。
感谢所有能告诉我实际上是多么愚蠢的人,以及为什么它不适用于一个愚蠢的简单原因。
(也是一个小问题,但不知道它是否重要:那些相等测试行返回nullPointerException错误,即使字符串得到了值)
boolean test1 = addedItemName.equals(nullString);
boolean test2 = addedItemName.equalsIgnoreCase(nullString);
System.out.println(addedItemName);
System.out.println(nullString);
输出:
空
空
线程中的异常“AWT-EventQueue-0”java.lang.NullPointerException
答案 0 :(得分:3)
null-String必须是:
String nullString = null;
原因' null'表示未引用的对象(请记住java中的所有内容都是对象)
String nullString = "null";
是对包含字母 null 的String的有效引用 你的输出有点混淆,导致
System.out.println("added item : " + null);
会产生您看到的输出。那会导致字符串连接:
https://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.1.11
...现在只需要考虑参考值。如果参考 为null,它被转换为字符串" null" (四个ASCII字符 空值)。否则,转换就像执行一样 使用no调用引用对象的toString方法 参数;但是如果调用toString方法的结果为null, 那么字符串" null"而是用来代替。