URI.create()vs new URI()

Unk*_*pus 13 java performance uri

A uri可以通过两种方式创建:

URI uri = new URI("https://www.google.com/");
Run Code Online (Sandbox Code Playgroud)

要么,

URI uri = URI.create("https://www.google.com/");
Run Code Online (Sandbox Code Playgroud)

我想知道哪个是更好的做法.我没有注意到任何性能差异,我已经阅读了文档,但是有点难以理解.对此有任何见解表示赞赏.

Ank*_*hal 15

阅读文档,它的用法不同.

通过解析给定的字符串来创建URI.这个方便工厂方法就好像通过调用{@link URI(String)}构造函数一样工作; 构造函数抛出的任何{@link URISyntaxException}都会被捕获并包装在新的{@link IllegalArgumentException}对象中,然后抛出该对象.

提供此方法是为了在已知给定字符串是合法URI的情况下使用,例如对于在程序中声明的URI常量,因此它将被视为字符串不能解析的编程错误.直接抛出{@link URISyntaxException}的构造函数应该用于从用户输入或可能容易出错的其他源构造URI的情况.

@param str要解析为URI的字符串

 * @return The new URI
 *
 * @throws  NullPointerException
 *          If {@code str} is {@code null}
 *
 * @throws  IllegalArgumentException
 *          If the given string violates RFC 2396
 */
Run Code Online (Sandbox Code Playgroud)
public static URI create(String str) {
    try {
        return new URI(str);
    } catch (URISyntaxException x) {
        throw new IllegalArgumentException(x.getMessage(), x);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @RaúlSalinas-Monteagudo 有时您需要将“不受信任的”字符串解析为 URI,在这种情况下,“强制”检查异常并不是一个坏主意。有时您知道该字符串是一个有效的 URI,并且使用 `create` 方法您不需要关心已检查的异常,因为您假设不会有任何异常。如果仍然存在 RuntimeException,则与 NullPointerException 处于同一级别。 (2认同)

Alf*_*rio 6

没有区别,因为URI.create将调用委托给构造函数。唯一真正的区别是将构造函数抛出的(已检查异常)URI.create(String)包装为(未检查异常)。因此,如果您不想处理已检查的异常,最好只调用.URISyntaxExceptionIllegalArgumentExceptionURI.create(String)

下面是 JDK 中的一段代码:

public static URI create(String str) {
    try {
        return new URI(str);
    } catch (URISyntaxException x) {
        throw new IllegalArgumentException(x.getMessage(), x);
    }
}
Run Code Online (Sandbox Code Playgroud)