xuhongxin8477 2012-12-09 14:35
浏览 267
已采纳

关于Java 字符串的一个小问题

我在代码里面想实现一个将Object对象打印的功能,具体的代码如下:

public class JavaJsonDemo {

    /**
     * @param args
     */
    public static void main(String[] args) {

        Object value = null;

        String str = "value=" + value;

        System.out.print(str);

    }
}

这单代码是可以正常执行的。

 

但是,如果将代码改为

 

    /**
     * @param args
     */
    public static void main(String[] args) {

        Object value = null;

        @SuppressWarnings("null")
        String str = "value=" + value.toString();

        System.out.print(str);

    }

就会报空指针的异常。

 

我的问题是:

java字符串在进行“+”操作的时候,难道不是调用的toString方法吗?如果是,那么第一种场景为什么可以顺利的被转换为null打印?

  • 写回答

1条回答 默认 最新

  • jinnianshilongnian 2012-12-09 17:05
    关注

    String str = "value=" + value; 在jdk5及以上变为
    StringBuilder s = new StringBuilder();
    s.append("value=");
    s.append(value);
    str = s.toString();

    append部分实现
    public AbstractStringBuilder append(Object obj) {
    return append(String.valueOf(obj));
    }
    public AbstractStringBuilder append(String str) {
    [color=red] if (str == null) str = "null";[/color]
    int len = str.length();
    if (len == 0) return this;
    int newCount = count + len;
    if (newCount > value.length)
    expandCapacity(newCount);
    str.getChars(0, len, value, count);
    count = newCount;
    return this;
    }

    可以看到内部if (str == null) str = "null";


    Object value = null;

    String str = "value=" + value.toString();

    value是null,则无法调用它的方法toString 因此空指针

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 VSCode里的Prettier如何实现等式赋值后的对齐效果?
  • ¥15 流式socket文件传输答疑
  • ¥20 keepalive配置业务服务双机单活的方法。业务服务一定是要双机单活的方式
  • ¥50 关于多次提交POST数据后,无法获取到POST数据参数的问题
  • ¥15 win10,这种情况怎么办
  • ¥15 如何在配置使用Prettier的VSCode中通过Better Align插件来对齐等式?(相关搜索:格式化)
  • ¥100 在连接内网VPN时,如何同时保持互联网连接
  • ¥15 MATLAB中使用parfor,矩阵Removal的有效索引在parfor循环中受限制
  • ¥20 Win 10 LTSC 1809版本如何无损提升到20H1版本
  • ¥50 win10 LTSC 虚拟键盘不弹出