27

此方法返回给定 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());
    }
}

它给了我这个错误:

Type mismatch: cannot convert from StringBuilder to String

还有两个选择:

  1. Change the return type to StringBuilder. 但我希望它返回一个字符串。
  2. Change type of ma to String. 更改 String 后没有 append() 方法。
4

3 回答 3

54

只需使用

return ma.toString();

代替

return ma;

ma.toString()返回 StringBuilder 的字符串表示形式。

有关详细信息,请参阅StringBuilder#toString()

正如 Valeri Atamaniouk 在评论中建议的那样,您还应该在catch块中返回一些内容,否则您将收到编译器错误missing return statement,因此编辑

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

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

会是个好主意。


编辑

正如 Esailija 所建议的,我们在这段代码中有三个反模式

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

所以我认为最好做这样的事情:

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

然后,当你调用它时:

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
}

检查这些链接以获取有关 Java 反模式的更多详细信息:

于 2013-04-22T20:09:30.807 回答
3

我在将 StringBuilder 转换为 String 时遇到了同样的问题,我使用了上述观点,但这并没有给出正确的解决方案。使用上面的代码输出是这样的

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

之后我找到了正确的解决方案。想像这样创建一个插入 StringBuilder 的新字符串。

String out=new String(ma);
于 2017-02-24T06:47:41.537 回答
0

尝试

返回 ma.toString(); 因为您不能直接将 stringbuilder 变量存储到字符串变量中。

于 2018-09-14T10:44:38.627 回答