Type mismatch: cannot convert from StringBuilder to String

android, java

Solution

Just use

return ma.toString();

instead of

return ma;

`ma.toString()` returns the string representation for your StringBuilder.

See StringBuilder#toString() for details

As Valeri Atamaniouk suggested in comments, you should also return something in the `catch` block, otherwise you will get a compiler error for `missing return statement`, so editing

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

to

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

Would be a good idea.

EDIT

As Esailija suggested, we have three anti-patterns in this code

} 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
}

So i think it is better to do something like that:

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();
}

And then, when you call it:

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
}

Check these links for further details about Java Anti-Patterns:

- Java Anti-Patterns

- Programming Anti-Patterns

- An Introduction to Antipatterns in Java Applications

Problem

This method returns the source of the given URL. ``` 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()); } } ``` It gives me this error: ``` Type mismatch: cannot convert from StringBuilder to String ``` And two choices: - `Change the return type to StringBuilder.` But I want it to return a String. - `Change type of ma to String.` After changing a String has no append() method.

Original source