java.lang.String(原始字符串)的文档记录不充分

java.lang.String(原始字符串)的文档记录不充分,java,string,copy-constructor,Java,String,Copy Constructor,具体来说,如果original为null,它会抛出一个NullPointerException。但是javadocs没有提到这一点 我知道,它说除非需要显式副本,否则这个构造函数不应该是必需的,但我正在为一些包含字符串的较大对象编写副本构造函数,虽然可能严格来说没有必要创建显式副本,因为在这种情况下,所有其他对象都得到显式副本,我愿意为效率低下付出一点代价 但是这个javadoc中不应该有抛出吗?字符串是不可变的。您不想创建一个字符串myString=newstringblah;因为这将在堆中产

具体来说,如果original为null,它会抛出一个NullPointerException。但是javadocs没有提到这一点

我知道,它说除非需要显式副本,否则这个构造函数不应该是必需的,但我正在为一些包含字符串的较大对象编写副本构造函数,虽然可能严格来说没有必要创建显式副本,因为在这种情况下,所有其他对象都得到显式副本,我愿意为效率低下付出一点代价


但是这个javadoc中不应该有抛出吗?

字符串是不可变的。您不想创建一个字符串myString=newstringblah;因为这将在堆中产生一个新对象。最好是使用字符串myString=blah;并链接到字符串池

String myString = "blah";
String myOtherString = myString;

myOtherString = "";
// at this point myString == "blah"
NullPointerException是一个未经检查的异常,因此,尽管您非常学究,您可以在javadoc中添加@throws行,但最好不要这样做。假设如果你在没有意义的地方传递null,你会得到一个NPE。未经检查的异常通常表示编码错误,而不是异常但有效的场景

新的字符串null没有意义,因为构造函数无法生成null的精确副本

复制字符串也是完全不必要的,因为它们是不可变的。

来自:

除非另有说明,否则将null参数传递给此类中的构造函数或方法将导致引发NullPointerException

报告说:

除非需要original的显式副本,否则不需要使用此构造函数,因为字符串是不可变的

所以你真的不应该叫它


此外,我认为,如果在

中传递null,则抛出NPE是合理的。RuntimeException保留用于指示使用null对象的API的错误使用的异常,这可能发生在Java程序中的任何位置,因此,这不是字符串类或任何特定类所特有的,文档的问题已经由公认的答案解决了

我只是想回应一下这个评论。。。这可能是你问题的根源


但这假设传递null是没有意义的。假设您正在复制某个对象,该对象具有许多数据成员字段,其中一些字段是字符串,可能为空,也可能不为空。在这种情况下,我希望StringString返回null,具体地说,我希望它复制null值

这是不可能的。JLS特别声明新操作生成一个新对象,而不是null

如果您希望能够创建并返回一个对象或null,那么必须将此逻辑嵌入某种工厂方法中;e、 g

String myNewString(String s) {
    return s == null ? s : new String(s);
}

但也值得注意的是,在大多数情况下,用Java复制字符串是不必要和浪费的。只有当应用程序专门使用字符串的对象标识时,才应该这样做;i、 e.它使用==来比较字符串对象,并且依赖于与false比较相同字符的字符串。需要的应用程序非常罕见

NullPointerException不是选中的异常。很抱歉,我不是指签名中的throws声明,而是指javadoc中的@throws标记。坦白说,除非另有说明,否则您应该假设不允许使用Null。空不容忍是一个很好的默认值。但这假设传递空是没有意义的。假设您正在复制某个对象,该对象具有许多数据成员字段,其中一些字段是字符串,可能为空,也可能不为空。在这种情况下,我希望StringString返回null,具体地说,我希望它复制null值。你所问的是不可能的:构造函数不能返回null。另请参见。好吧,这是有意义的。@SteveCohen Yep,这正是我的意思。那么他们为什么不反对它呢?你真的想说,如果你愚蠢到使用了一个不必要的方法,如果你将null传递给它,你就应该得到一个null指针异常?@Bohemian-在某些情况下,调用这个构造函数是有理由的。我想我们可以假设OP有这样的情况,但这并不能真正解决问题。是的,如果您将库视为一个黑盒子而忽略javadoc,那么任何调用都可能抛出任何未检查的异常。在实践中,未经检查的异常仅在特定情况下抛出,并且应该记录这些情况。在这种情况下……在每个文档化的Java类中都包含“throws NullPointerException”是没有意义的。我认为它已经有足够的文档记录,因为这是一种API误用。这通常是正确的,但并不总是正确的。有时您需要创建一个与原始字符串具有相同值的字符串。。。但是不同的对象身份。