Java,简单HTTP客户端上的“URI不能为空”错误

时间:2014-09-23 21:24:40

标签: java http uri

我正在尝试编写一个简单的HTTP客户端,在给定绝对HTTP路径的情况下,执行简单的HTTP GET请求并将内容打印到标准输出。

但是,我在尝试加载的任何页面上都收到以下错误:

    java.lang.IllegalArgumentException: URI can't be null.
    at sun.net.spi.DefaultProxySelector.select(DefaultProxySelector.java:141)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:926)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:850)
    at HTTrack.main(HTTrack.java:68)

引发异常的代码是:

try
{
    System.out.println("We will attempt to read " + getfilepath(args[0]) + " from " + getbasesite(args[0]));
    URL serverConnect = new URL("http", getbasesite(args[0]), getfilepath(args[0]));
    con = (HttpURLConnection)serverConnect.openConnection();
    con.setRequestMethod("GET");    
    con.setDoOutput(true);
    con.setReadTimeout(10000);
    System.out.println("Attempting to connect to " + getbasesite(args[0]) + " on port 80...");
    System.out.println("URL = " + con.getURL());
    con.connect();
    //System.out.println("Connection succeeded! Attempting to read remote file " + getfilepath(args[0]));
    BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
    String line = "";
    while((line = br.readLine()) != null)
    {
        System.out.println(line);
    }

}

引发异常(HTTrack.java:68)的行是con.connect()行,函数getbasesitegetfilepath返回URL的服务器主机名和远程文件路径分别。

例如,如果传递字符串http://www.somesite.com/somepage.htmlgetbasesite将返回"www.somesite.com"getfilepath将返回"/somepage.html"。我知道HttpURLConnection正在正确传递这些值,因为当我调用getURL时,它会返回我期望的内容:http://www.somesite.com/somepage.html

我对可能导致此错误的原因感到困惑 - 我已经测试过HttpURLConnection类确实从行System.out.println("URL = " + con.getURL());的构造函数参数中获取了正确的URL,所以我'我不知道为什么没有尝试连接“URI不能为空”的错误。

1 个答案:

答案 0 :(得分:2)

尝试删除con.setDoOutput(true);或将其设置为false。该行告诉您的连接,您将使用它来编写输出,但稍后您将通过调用con.getInputStream()从流中读取。