Java toString()是否应该返回null?

Java toString()是否应该返回null?,java,string,tostring,Java,String,Tostring,如果无法进行转换,java中的方法toString()是否应该返回null,或者在这种情况下它应该返回空字符串?toString()返回null将是非常糟糕的API设计。显然,如果您能够对其调用toString(),那么对象显然不是空的。否则,将出现NullPointerException 这实际上取决于对象和用例是什么。如果您使用toString()执行实际逻辑,空字符串是可以的-例如,如果您使用toString()作为键值存储的键。如果只是用于调试/记录。只需打印出所有字段。e、 g,类似于

如果无法进行转换,java中的方法
toString()
是否应该返回null,或者在这种情况下它应该返回空字符串?

toString()
返回null将是非常糟糕的API设计。显然,如果您能够对其调用
toString()
,那么对象显然不是空的。否则,将出现
NullPointerException


这实际上取决于对象和用例是什么。如果您使用
toString()
执行实际逻辑,空字符串是可以的-例如,如果您使用
toString()
作为键值存储的键。如果只是用于调试/记录。只需打印出所有字段。e、 g,类似于。null不是字符串,因此不允许在此处返回。查看Java文档:

返回对象的字符串表示形式。通常,toString方法返回一个“文本表示”此对象的字符串。结果应该是一个简洁但信息丰富的表示,便于一个人阅读。建议所有子类重写此方法

它应该返回对象的有意义的字符串表示形式。我写了一个如何使用它以及为什么它有用的例子:

public class Car {
    private String make;
    private int year;
    public Car(String make, int year) {
        this.make = make;
        this.year = year;
    }    

    @Overrride
    public String toString() {
        return "Car Make:" + make + "; Built Year: " + year;
    }
}
例如:

Car myCar = new Car("Nissan", 1999);
Car yourCar = new Car("BMW", 2018);
System.out.println(myCar);  // call toString() implicitly
System.out.println(yourCar);
它将打印2行,你可以很容易地阅读文本,并知道这是你的车

Car Make:Nissan; Built Year: 1999
Car Make:BMW; Built Year: 2018

我检查过的每个最新版本的Java API文档都说:

返回: 对象的字符串表示形式

换句话说,null不是定义的返回值。如果不重写toString()方法,则始终会得到至少提供对象ID的字符串

尽管这并不排除重写方法返回null的可能性,但任何这样做的程序员都应该期望从可能在该代码上运行的工具和框架中获得大量NPE

我的意见是:不要这样做


我的问题:什么样的对象不能用字符串表示?

我认为
toString
应该总是返回一些有用的东西-这是调试的主要情况。就我个人而言,我会依靠“格式化程序”将对象格式化为特定的
字符串
表示形式,以便显示-IMHO。如果没有更多的上下文,每个“规则”都有一个例外什么是这样一个对象?如果没有好的字符串表示法,您就不能使用默认实现吗?感谢您发现这是一个重复的实现,标题搜索起来有点晦涩。如果使用
toString()
返回任何类型的“真实逻辑”,特别是将其用作[unique]键,说得客气一点,“这是不明智的。”凯文安德森说得对。我不能宽恕它。但我看到遗留系统依赖它,这正是我提到的用例。在这种情况下,如果空字符串是预期的表示形式,则可以。但是
toString()
返回null只会让我退出。遗留系统。。。别让我开始!