【问题标题】:Why the below code is not working (StringBuffer.toString !=null) [closed]为什么下面的代码不起作用(StringBuffer.toString!=null)[关闭]
【发布时间】:2014-09-24 05:17:32
【问题描述】:

我是字符串世界的新手,

我的编码如下,

StringBuffer buffer=new StringBuffer();
String addressLineOne=null;
buffer.append(addreeLineOne);
if(buffer.toString!=null)
{
 system.out.println("Not NULL");
}

结果:非空; (buffer.toString!=null)==true

尽管我已将 null 附加到缓冲区,但我无法通过 NUll 检查来识别它, 代码打印不为空

为什么会这样?

【问题讨论】:

  • 这段代码无法编译,这里没有显示StringBuffer返回true.
  • 阅读StringBufferappend 的javadoc,它指向String.valueOf 的javadoc,如果你问我认为你在问什么,它应该回答你的问题。
  • 我认为这是一个很好的问题,除了 OP 的编译问题。
  • 请不要使用StringBuffer,十年前它被StringBuilder取代了,toString()永远不应该返回null。你得到的是"null",它是一个带有字母null的字符串。
  • @EJP 代码将在我添加字符串对象而不是 null 时编译。

标签: java stringbuffer


【解决方案1】:

打印if条件内的缓冲区,自己看看:

if(buffer.toString()!=null){
    System.out.println("Not NULL: " + buffer.toString());
}

输出:非空:空

Null 以字符串形式存储在缓冲区中 - 作为“null”而不是实际的 null。

【讨论】:

    【解决方案2】:
    public StringBuffer append(Object obj)
    

    附加 Object 参数的字符串表示形式。

    整体效果就像将参数转换为 字符串由方法 String.valueOf(Object) 和字符 然后将该字符串附加到该字符序列中

    所以addressLineOne,在被附加到缓冲区之前将被转换为String 表示。

    根据JLS, Section 15.18.1.1

    如果引用为null,则转换为字符串“null”

    隐含地,这会发生:String.valueOf(addressLineOne) // 会给你一个值“null”的字符串。

    然后字符串“null”中的每个字符都会被附加到缓冲区中。

    注意:另一方面,new StringBuffer().append(null); 会给你一个编译错误,因为重载的 append() 方法的参数 null 会模棱两可,String.valueOf(null) 会抛出一个 @987654330 @。

    【讨论】:

    • 其他 cmets 中都说了为什么这永远不会为空。
    • 真 :)。但是一个问题需要一个答案,我给了它一个。
    • 抱歉这个无用的评论 :) 按 并没有让我换行(oups),然后我意识到我不在好部分(我的评论不适合你,但对于提出问题的人)。
    【解决方案3】:

    以下是 StringBuffer 中 toString() 的实现。

    public synchronized String toString() {
        return new String(value, 0, count);
        }
    

    可以看出它总是调用 new String() 因此总是会导致非空返回

    【讨论】:

      猜你喜欢
      • 2021-08-27
      • 1970-01-01
      • 2018-07-05
      • 1970-01-01
      • 2017-06-15
      • 1970-01-01
      • 2013-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多