2013-04-22 12 views
16

Questo metodo restituisce l'origine dell'URL specificato.Tipo non corrispondente: impossibile convertire da StringBuilder in stringa

private static String getUrlSource(String url) { 
    try { 
     URL localUrl = null; 
     localUrl = new URL(url); 
     URLConnection conn = localUrl.openConnection(); 
     BufferedReader reader = new BufferedReader(
      new InputStreamReader(conn.getInputStream())); 
     String line = ""; 
     String html; 
     StringBuilder ma = new StringBuilder(); 
     while ((line = reader.readLine()) != null) { 
      ma.append(line); 
     } 
     return ma; 
    } catch (Exception e) { 
     Log.e("ERR",e.getMessage()); 
    } 
} 

Mi dà questo errore:

Type mismatch: cannot convert from StringBuilder to String 

E due scelte:

  1. Change the return type to StringBuilder. Ma io voglio che restituire una stringa.
  2. Change type of ma to String. Dopo aver modificato una stringa non ha alcun metodo append().
+6

'tornare ma.toString() ; '??? – Esailija

+0

Come nota a margine, si potrebbe voler 'ma.append (riga) .appendere (LINE_SEPERATOR)' o le linee saranno tutte incomprensibili come 'Questa è la riga 1. Questa è la linea 2. Questa è la riga 3.' – corsiKa

risposta

37

Basta usare

return ma.toString(); 

invece di

return ma; 

ma.toString() restituisce la rappresentazione di stringa per il vostro StringBuilder.

Vedi StringBuilder#toString() per i dettagli

Come Valeri Atamaniouk suggerito nei commenti, si dovrebbe anche restituire qualcosa nel blocco catch, altrimenti si otterrà un errore di compilazione per missing return statement, in modo da modificare

} catch (Exception e) { 
    Log.e("ERR",e.getMessage()); 
} 

a

} catch (Exception e) { 
    Log.e("ERR",e.getMessage()); 
    return null; //or maybe return another string 
} 

Sarebbe una buona idea.


EDIT

Come suggerito Esailija, abbiamo tre anti-pattern in questo codice

} catch (Exception e) {   //You should catch the specific exception 
    Log.e("ERR",e.getMessage()); //Don't log the exception, throw it and let the caller handle it 
    return null;     //Don't return null if it is unnecessary 
} 

quindi penso che è meglio fare una cosa del genere:

private static String getUrlSource(String url) throws MalformedURLException, IOException { 
    URL localUrl = null; 
    localUrl = new URL(url); 
    URLConnection conn = localUrl.openConnection(); 
    BufferedReader reader = new BufferedReader(
      new InputStreamReader(conn.getInputStream())); 
    String line = ""; 
    String html; 
    StringBuilder ma = new StringBuilder(); 
    while ((line = reader.readLine()) != null) { 
     ma.append(line); 
    } 
    return ma.toString(); 
} 

E poi, quando lo chiami:

try { 
    String urlSource = getUrlSource("http://www.google.com"); 
    //process your url source 
} catch (MalformedURLException ex) { 
    //your url is wrong, do some stuff here 
} catch (IOException ex) { 
    //I/O operations were interrupted, do some stuff here 
} 

Controllare questi link per ulteriori dettagli su Java anti-pattern:

+0

Aggiungi ritorno eccezionale –

+0

@ValeriAtamaniouk cosa? – BackSlash

+0

La funzione deve anche restituire un valore in caso di eccezione. Se non l'hai notato. –

1

Ho lo stesso problema durante la conversione StringBuilder String, e io uso sopra il punto, ma non è la soluzione giusta. usando sopra uscita del codice viene in questo modo

String out=ma.toString(); 
// out=[Ljava.lang.String;@41e633e0 

Dopo che scopro corretta solution.Think è creare un nuovo istante stringa inserita di StringBuilder come questo ..

String out=new String(ma); 
Problemi correlati