2009-04-27 28 views
7

Estoy trabajando en un programa de servidor cliente SSL y tengo que reutilizar el siguiente método.¿Cómo debo resolver java.lang.IllegalArgumentException: protocol = https host = null Exception?

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; 

    } 

Aquí ServerURL se inicializa como

private URL serverURL = null; 

Cuando intento ejecutar este método consigo una excepción en Línea,

OutputStream os = conn.getOutputStream();

La excepción es

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

¿Cuál es la razón de esto?

Respuesta

18

Las URL usan barras diagonales (/), no hacia atrás (como ventanas). Proveedores:

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

La razón por la cual se obtiene el error es que la clase URL no puede analizar la parte de host de la cadena y, por lo tanto, es hostnull.

3

Este código parece completamente innecesario:

String serverURLS = getRecipientURL(message); 

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

if (serverURLS != null){ 
    serverURL = new URL(serverURLS); 
} 
  1. serverURLS se le asigna el resultado de getRecipientURL(message)
  2. Inmediatamente después, se sobrescribe el valor de serverURLS, por lo que la declaración anterior de un dead store
  3. Entonces, porque if (serverURLS != null) evalúa a true, ya que solo asignó la variable a valu e en la declaración anterior, asigna un valor a serverURL. ¡Es imposible para if (serverURLS != null) evaluar a false!
  4. En realidad, nunca utiliza la variable serverURLS más allá de la línea de código anterior.

Se podría reemplazar todo esto con sólo:

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

Hola, esa línea se añade por mí sólo para comprobar el motivo del error. En realidad, la URL se filtra utilizando el mensaje. Tenga en cuenta que la asignación de ServerURLs es una línea de prueba :) –

Cuestiones relacionadas