我正在使用java HttpURLConnection类连接到URL,并且我想产生ConnectException来监视和记录一些数据。我只是尝试连接随机网站,但即使尝试访问不存在但正在捕获ConnectionException的url时,也无法生成MalformedURLException

来自ConnectException的Java文档,

http://docs.oracle.com/javase/7/docs/api/java/net/ConnectException.html#ConnectException()


  表示尝试将套接字连接到时发生错误
  远程地址和端口。通常,连接被拒绝
  远程(例如,没有进程在远程地址/端口上侦听)。


这意味着需要从远程服务器拒绝该连接,但是我不知道这是什么意思,以及如何从我的Java代码生成它?

最佳答案

当您尝试连接到不存在的URL时,会发生两种错误:


域本身的DNS条目不存在。想想www.argh-nonexistant.com与www.google.com
该域存在,并且Web服务器正在侦听,但是路径不存在。 (http://www.google.de/please-give-my-an-error/


在这两种情况下,都不会抛出ConnectException,因为此异常要求


域的DNS条目有效,并且名称解析成功,并且
给定端口上没有运行Websever。


ConnectException和套接字基本上位于ISO / OSI堆栈的第3层或第4层(即TCP / IP)上,而格式错误的URL是应用程序层的问题。

您的解决方案:查找具有有效DNS条目但没有侦听Web服务器的服务器。除非您自己在端口80上托管网络服务器,否则::1应该是一个安全的选择。这是一个最小的工作示例:

package Foo;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;

public class TestClass {
    public static void main(String[] args) throws IOException {
        URL url = new URL("http://localhost");
        HttpURLConnection c = (HttpURLConnection)url.openConnection();
        c.connect();
    }
}

07-25 21:43