0

具体来说,如果 original 为 null,它会抛出 NullPointerException。然而javadocs没有提到它。

我知道,它说除非需要显式复制,否则不需要此构造函数,但我正在为一些包含字符串的较大对象编写复制构造函数,虽然可能不是绝对需要进行显式复制,因为其他所有内容在这种情况下得到一个明确的副本,我愿意为效率低下付出一点代价。

但是这个 javadoc 中不应该有一个 throws 吗?

4

6 回答 6

6

来自JavaTM 2 平台标准。埃德。v1.4.2

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

于 2012-12-14T23:50:31.810 回答
1

NullPointerException是一个未经检查的异常,所以虽然如果你很迂腐,你可以在 javadoc 中添加一个 @throws 行,但最好不要。假设如果你在没有意义的地方传递 null,你会得到一个 NPE。(未经检查的异常通常表示编码错误,而不是异常但有效的情况。)

而且new String( null )没有任何意义,因为构造函数不能产生null.

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

于 2012-12-14T23:48:20.313 回答
0

字符串是不可变的。您不想创建 a String myString = new String("blah");,因为这会导致堆中的新对象。最好做String myString = "blah";并链接到字符串池。

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

myOtherString = "";
// at this point myString == "blah"
于 2012-12-14T23:48:16.347 回答
0

这个构造函数的javadoc说:

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

所以你真的不应该打电话给它。

另外,我认为如果你传入一个空值,抛出一个 NPE 是合理的

于 2012-12-14T23:52:21.383 回答
0

RuntimeException 保留用于指示错误使用 API(使用空对象)的异常,这些异常可能发生在 Java 程序的任何地方,因此它不是特定于 String 类(或任何特定类)

于 2012-12-14T23:53:57.040 回答
0

已接受的答案已解决了文档问题。

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

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

这是不可能的。JLS 特别声明该new操作产生一个新对象而不是null.

如果您希望能够“创建并返回一个对象”或null“您必须将此逻辑嵌入到某种工厂方法中;例如

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

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

于 2012-12-15T00:17:13.243 回答