容易忽视的toString方法 (转)

原创 2005年02月28日 10:45:00

先看一段程序
/*
 * Created on 2005-2-24
 */

/**
 * @author snowway
 */
public class A{

    private String id;

    public String toString(){
        return this.id;
    }

    public static void main(String[] args){
        System.out.println(new A());
    }
}

原来我想当然以为会打印null,可运行结果是:
Exception in thread "main" java.lang.NullPointerException
 at java.io.Writer.write(Writer.java:126)
 at java.io.PrintStream.write(PrintStream.java:457)
 at java.io.PrintStream.print(PrintStream.java:616)
 at java.io.PrintStream.println(PrintStream.java:753)
 at A.main(A.java:17)

仔细debug后才知道流程是这样的:
首先调用PrintStream.println(Object)方法,println(Object)调用PrintStream.print(Object)方法,这个方法使用了String.valueOf(Object)来
获取对象的字符串输出,我们看看String.valueOf(Object obj)源码:
 public static String valueOf(Object obj) {
      return (obj == null) ? "null" : obj.toString();
 }

没有问题,由于我们传递的new A()!=null,所以调用new A().toString(),那么此时toString返回的是this.id,很显然是null,
最后println调用了write(str, 0, str.length());呵呵,问题出来了,str==null,那么str.length显然是要抛出NPE的。

给我的教训是:千万不要让类的toString方法返回null!

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

容易忽视的toString方法

先看一段程序/* * Created on 2005-2-24 *//** * @author snowway */public class A{    private String id;    p...
  • snowway_
  • snowway_
  • 2005年02月24日 16:08
  • 3217

容易忽视的toString方法

容易忽视的toString方法 (转 from snowways blog )先看一段程序/* * Created on 2005-2-24 *//** * @author snowway */pub...
  • sukyle
  • sukyle
  • 2009年10月14日 14:45
  • 329

前端程序员经常忽视的一个JavaScript面试题

前言 年前刚刚离职了,分享下我曾经出过的一道面试题,此题是我出的一套前端面试题中的最后一题,用来考核面试者的JavaScript的综合能力,很可惜到目前为止的将近两年中,几乎没有人能够完全答对,并非...
  • bluehire
  • bluehire
  • 2016年02月16日 13:27
  • 439

String强制类型转换与toString()方法 的区别应用

刚刚在String强制类型转换与
  • javadeep
  • javadeep
  • 2014年09月01日 11:28
  • 730

重写Java实体类toString方法

利用ReflectionToStringBuilder重写toString方法,让日志可以直接打印对象中的数据,方便跟踪问题。 1、需要引入jar包,添加maven依赖: org.apache.co...
  • wangdw1984
  • wangdw1984
  • 2017年07月10日 22:27
  • 884

php 5 __toString()方法 类转换为字符串

a = $a;             $this->b = $b;             $this->c = $c;         }         public fu...
  • xiaosi2468
  • xiaosi2468
  • 2010年10月28日 18:32
  • 2279

JAVA中int与String的相互转化方法和使用

下面这一段是转载的,后面有一些运用上的感悟,倒是自己原创的,大神略过,希望对有的人有用就好。 ================================================= ...
  • hizzyzzh
  • hizzyzzh
  • 2014年12月01日 17:12
  • 333

Java 常忽略知识点总结

程序(program):是为了完成特定任务、用某种语言编写的一组指令的集合。即指的一段静态的 代码,静态对象。 进程(process):是程序的一次执行过程,或是正在运行的一个程序。 动态过程:有他自...
  • u011687186
  • u011687186
  • 2016年04月24日 13:07
  • 933

LINQ to Entity 不识别方法“System.String ToString()”,因此该方法无法转换为存储表达式。

最近在项目中一直遇到问题,其中最让人头疼的就是:    LINQ to Entity 不识别方法“System.String ToString()”,因此该方法无法转换为存储表达式。    错误出...
  • qqxyy99
  • qqxyy99
  • 2016年08月07日 22:05
  • 1830

int和string互转

int -> String  1.) String s = String.valueOf(i); 直接使用String类的静态方法,只产生一个对象,用的较多 2.) String...
  • chengyabingfeiqi
  • chengyabingfeiqi
  • 2015年11月24日 19:35
  • 442
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:容易忽视的toString方法 (转)
举报原因:
原因补充:

(最多只允许输入30个字)