java.net.URL中-1端口值的含义是什么?

5
我需要使用java.net.url类的构造函数来创建基于端口号的URL。为此,我使用了下面的构造函数:public URL(String protocol, String host, int port, String file){}。我需要创建两个不同的URL;如果端口是80,则需要忽略端口,否则URL应包含端口号。我无法将端口号发送为空值,但可以使用值-1。当我使用-1作为端口时,它将创建没有端口的URL。
我的问题在于构造函数的文档说明,在构造函数上方有一个描述,该描述是“指定{@code -1}的{@code port}表示URL应使用协议的默认端口。”正如我所提到的,我不想使用默认端口号。如果这种情况发生,我怎样才能只用这个构造函数创建URL呢?
顺便说一下,我知道我可以只使用字符串版本,但我不想编写两个新URL来做到这一点。基本上,我想写这样的东西: new URL(scheme, serverName, serverPort == 80 ? -1 : serverPort, contextPath); //如我所提到的,根据URL构造函数的文档,-1会得到默认的端口号,但在代码中并不是这样。 等待您的建议。谢谢。 编辑 new URL(scheme, serverName, serverPort == 80 ? null: serverPort, contextPath);

2
正如我所提到的,我不想使用默认端口号 - 你好像是这样做的。我理解为“创建没有端口号的URL,以便解释URL的任何内容都将使用默认端口。” - Jon Skeet
@Joni 是的,但根据文档使用的是默认端口,即HTTP的80端口。这就是为什么我感到困惑,我的实现行为符合预期,但文档不像代码那样。 - ytWho
2
port是我查看的URL实现中的一个int字段。这意味着它不能null-1相当于“未指定”(也被解释为“使用默认端口”和“在外部形式中不打印端口号”)。没有第三个状态。 - Joachim Sauer
@JoachimSauer 那么,您的意思是,如果端口为-1,则创建的URL将不包含端口? - ytWho
@ytWho:没错。 - Joachim Sauer
显示剩余5条评论
3个回答

1
我看到文档让您感到困惑了。当文档说:
指定{@code port}号为{@code -1}表示URL应使用协议的默认端口。
它的意思是,URL被创建时没有端口号。但是当您连接到主机时,需要使用端口,如果URL没有端口,则将使用协议的默认端口
  • URL的字符串表示不会使用默认端口。
  • 由URL.openConnectiom创建的网络连接使用默认端口。

1
URL类本身只是简单地存储端口号,如果您提供了它,则会存储端口号;如果您没有提供它,则不会存储端口号。
如果它没有存储一个端口号(在内部和参数中表示为-1),则URL的外部形式将不会指定一个可见的端口。这似乎正是您想要做的。
当它说“如果未指定端口,则使用协议的默认端口。”时,它的意思是,如果您实际上以某种方式访问URL(换句话说,当代码必须知道特定的端口时),并且您没有指定一个,则处理程序将使用协议中的默认值。
换句话说:http://example.org/http://example.org:80/是两个不同的URL(第一个在URL对象中的port设置为-1)。但是,如果您尝试连接它们,那么它们将执行完全相同的步骤(因为在没有明确指定端口的情况下,任何HTTP客户端都将使用端口80)。

0

所以你想要构造函数:

public URL(String protocol, String host, int port, String file){}

当端口是80时,不需要关注端口吗?

难道不应该像这样:

if(port == 80) return URL(protocol, host, file)
else return URL(protocol, host, port, file)

足够吗?

由于int是原始类型,您无法将其设置为null。因此,无论您喜欢与否,您必须在此定义一个数字。

三个参数的构造函数也只是将端口设置为-1:

public URL(String protocol, String host, String file)
        throws MalformedURLException {
    this(protocol, host, -1, file);
}

因此,你最好做以下事情:
URL url = new URL("http","localhost",port == 80 ? -1 : port,null);

由于所有这些构造函数都导致五个参数的构造函数,因此端口将按以下方式进行评估:

        if (port < -1) {
            throw new MalformedURLException("Invalid port number :" +
                                                port);
        }
        this.port = port;
        authority = (port == -1) ? host : host + ":" + port;

在这里你没有选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接