我该如何解决java.lang.IllegalArgumentException:protocol = https host = null异常?

时间:2009-04-27 12:17:28

标签: java exception ssl stream

我正在研究SSL客户端服务器程序,我必须重用以下方法。

private boolean postMessage(String message){
    try{ 
         String serverURLS = getRecipientURL(message);

         serverURLS = "https:\\\\abc.my.domain.com:55555\\update";

         if (serverURLS != null){
             serverURL = new URL(serverURLS);
         }

        HttpsURLConnection conn = (HttpsURLConnection)serverURL.openConnection();

        conn.setHostnameVerifier(new HostnameVerifier() { 
        public boolean verify(String arg0, SSLSession arg1) {
            return true;
        } 
        });

        conn.setDoOutput(true);

        OutputStream os = conn.getOutputStream();

        OutputStreamWriter wr = new OutputStreamWriter(os);

        wr.write(message);

        wr.flush();

        if (conn.getResponseCode() != HttpsURLConnection.HTTP_OK)
            return false;
        else
            return true;

    }

此处ServerURL初始化为

private URL serverURL = null;

当我尝试执行此方法时,我在Line获得了一个异常,

  

OutputStream os = conn.getOutputStream();

例外是

java.lang.IllegalArgumentException: protocol = https host = null

这是什么原因?

3 个答案:

答案 0 :(得分:18)

网址使用正斜杠(/),而不是向后斜杠(作为窗口)。尝试:

serverURLS = "https://abc.my.domain.com:55555/update";

您收到错误的原因是URL类无法解析字符串的主机部分,因此hostnull

答案 1 :(得分:3)

这段代码似乎完全没必要:

String serverURLS = getRecipientURL(message);

serverURLS = "https:\\\\abc.my.domain.com:55555\\update";

if (serverURLS != null){
    serverURL = new URL(serverURLS);
}
  1. serverURLS被分配了getRecipientURL(message)
  2. 的结果
  3. 然后立即覆盖serverURLS的值,使之前的语句成为dead store
  4. 然后,因为if (serverURLS != null)评估为true,因为您只是在前面的语句中为变量分配了值,所以您将值赋给serverURLif (serverURLS != null)无法评估为false
  5. 您实际上从未在上一行代码之外使用变量serverURLS
  6. 你可以用以下方式替换所有这些:

    serverURL = new URL("https:\\\\abc.my.domain.com:55555\\update");
    

答案 2 :(得分:0)

可能会对其他人有所帮助-我来这里是因为我错过了在http:之后加上两个//。这就是我所拥有的:

http:/abc.my.domain.com:55555 / update