gpt4 book ai didi

java - java.net.URI 对象的 getPath 方法是否有可能返回 null? (如果是,什么时候?)

转载 作者:搜寻专家 更新时间:2023-10-30 21:24:05 25 4
gpt4 key购买 nike

根据URI javadoc getPath 方法返回“此 URI 的解码路径组件,如果路径未定义则返回 null”(强调)。这会让我相信,如果我的应用程序依赖于 getPath 的返回值,我可能需要检查它是否为 null。然而,这似乎永远不可能发生。

下面的代码展示了我尝试构造一个 URI 对象的尝试,该对象的 getPath 返回 null,但是如您所见,我还没有发现这样的情况。有人可以解释一下这是怎么发生的吗?

编辑:我注意到 mailto URI 没有路径。 但是,我真正想问的是:是否有一个 URI使用具有未定义/空路径的 http、https、ftp 或文件方案?

import java.net.URI;
import java.net.URISyntaxException;

public class URIGetPathNullTest {

public static void main(String []args) throws Exception {
test1();
test2();
test3();
test4();
test5();
test6();
test7();
}


public static void test1() throws URISyntaxException {
String urlString = "";
URI uri = new URI(urlString);
printUri(uri);
// Output:
// toString() -->
// getPath -->
// getPath null? false
}

public static void test2() throws URISyntaxException{
String scheme = null;
String ssp = null;
String fragment = null;
URI uri = new URI(
scheme,
ssp,
fragment
);
printUri(uri);
// Output:
// toString() -->
// getPath -->
// getPath null? false
}

public static void test3() throws URISyntaxException {
String scheme = null;
String userInfo = null;
String host = null;
int port = -1;
String path = null;
String query = null;
String fragment = null;
URI uri = new URI(
scheme,
userInfo,
host,
port,
path,
query,
fragment
);
printUri(uri);
// Output:
// toString() -->
// getPath -->
// getPath null? false

}

public static void test4() throws URISyntaxException {
String scheme = null;
String host = null;
String path = null;
String fragment = null;
URI uri = new URI(
scheme,
host,
path,
fragment
);
printUri(uri);
// Output:
// toString() -->
// getPath -->
// getPath null? false
}

public static void test5() throws URISyntaxException {
String scheme = null;
String authority = null;
String path = null;
String query = null;
String fragment = null;
URI uri = new URI(
scheme,
authority,
path,
query,
fragment
);
printUri(uri);
// Output:
// toString() -->
// getPath -->
// getPath null? false
}

public static void test6() throws URISyntaxException {
String urlString = "?some-query";
URI uri = new URI(urlString);
printUri(uri);
// Output:
// toString() --> ?some-query
// getPath -->
// getPath null? false
}

public static void test7() throws URISyntaxException {
String urlString = "#some-fragment";
URI uri = new URI(urlString);
printUri(uri);
// Output:
// toString() --> #some-fragment
// getPath -->
// getPath null? false
}

public static void printUri(URI uri) {
System.out.println("toString() --> " + uri.toString());
System.out.println("getPath --> " + uri.getPath());
System.out.println("getPath null? " + (uri.getPath() == null));
}
}

最佳答案

我正在阅读 RFC2956并注意到我只想到与 http/ftp/文件方案对应的 URI。 mailto URI 就是一个没有路径的例子。

public static void test8() throws URISyntaxException {
String urlString = "mailto:mduerst@ifi.unizh.ch";
URI uri = new URI(urlString);
printUri(uri);
// Output:
// toString() --> mailto:mduerst@ifi.unizh.ch
// getPath --> null
// getPath null? true
}

编辑:与news 方案类似。

public static void test9() throws URISyntaxException {
String urlString = "news:comp.infosystems.www.servers.unix";
URI uri = new URI(urlString);
printUri(uri);
// Output:
// toString() --> news:comp.infosystems.www.servers.unix
// getPath --> null
// getPath null? true
}

(我在下面合并了我的其他答案)

the beginning of the URI javadoc 上有一条很好的线索:

An opaque URI is an absolute URI whose scheme-specific part does not begin with a slash character ('/'). Opaque URIs are not subject to further parsing. Some examples of opaque URIs are:

mailto:java-net@java.sun.com
news:comp.lang.java
urn:isbn:096139210x

当且仅当 URI 不透明时,getPath 似乎返回 null,这很容易用 isOpaque method 进行检查.因此,如果我确保 URI 不是不透明的,那么我就不需要检查 getPath 的结果是否为 null

查看 source for java.net.URI在 openjdk 7-b147 中,我注意到 path 字段的注释,然后查看了 isOpaque 的源代码,这似乎证实了这一点:

private transient String path;  // null ==> opaque

// ...

public boolean isOpaque() {
return path == null;
}

关于java - java.net.URI 对象的 getPath 方法是否有可能返回 null? (如果是,什么时候?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18519260/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com