具体来说,如果 original 为 null,它会抛出 NullPointerException。然而javadocs没有提到它。
我知道,它说除非需要显式复制,否则不需要此构造函数,但我正在为一些包含字符串的较大对象编写复制构造函数,虽然可能不是绝对需要进行显式复制,因为其他所有内容在这种情况下得到一个明确的副本,我愿意为效率低下付出一点代价。
但是这个 javadoc 中不应该有一个 throws 吗?
具体来说,如果 original 为 null,它会抛出 NullPointerException。然而javadocs没有提到它。
我知道,它说除非需要显式复制,否则不需要此构造函数,但我正在为一些包含字符串的较大对象编写复制构造函数,虽然可能不是绝对需要进行显式复制,因为其他所有内容在这种情况下得到一个明确的副本,我愿意为效率低下付出一点代价。
但是这个 javadoc 中不应该有一个 throws 吗?
除非另有说明,否则将 null 参数传递给此类中的构造函数或方法将导致抛出 NullPointerException。
NullPointerException
是一个未经检查的异常,所以虽然如果你很迂腐,你可以在 javadoc 中添加一个 @throws 行,但最好不要。假设如果你在没有意义的地方传递 null,你会得到一个 NPE。(未经检查的异常通常表示编码错误,而不是异常但有效的情况。)
而且new String( null )
没有任何意义,因为构造函数不能产生null
.
复制字符串也完全没有必要,因为它们是不可变的。
字符串是不可变的。您不想创建 a String myString = new String("blah");
,因为这会导致堆中的新对象。最好做String myString = "blah";
并链接到字符串池。
String myString = "blah";
String myOtherString = myString;
myOtherString = "";
// at this point myString == "blah"
RuntimeException 保留用于指示错误使用 API(使用空对象)的异常,这些异常可能发生在 Java 程序的任何地方,因此它不是特定于 String 类(或任何特定类)
已接受的答案已解决了文档问题。
我只是想回应这个评论......这可能是你问题的根源。
但这假设传递 null 是没有意义的。假设您正在复制一些具有许多数据成员字段的对象,其中一些是字符串,并且可能为空,也可能不为空。在这种情况下,我希望 String(String) 返回 null,具体来说,我希望它复制 null 值。
这是不可能的。JLS 特别声明该new
操作产生一个新对象而不是null
.
如果您希望能够“创建并返回一个对象”或null
“您必须将此逻辑嵌入到某种工厂方法中;例如
String myNewString(String s) {
return s == null ? s : new String(s);
}
但同样值得注意的是,在大多数情况下,在 Java 中复制 aString
是不必要且浪费的。仅当您的应用程序专门使用字符串的对象标识时,您才应该这样做;即它用于==
比较字符串对象并依赖于与 . 比较的具有相同字符的字符串false
。(需要的应用程序非常罕见......)