下载JSON时出现Android奇怪的bug

时间:2015-07-27 22:22:37

标签: java android json download

我需要在字符串中下载一个JSON,我几乎可以肯定代码没有错,但是有些奇怪...

public boolean downloadJSON(){
    json="";
    try{
        URL url = new URL(theURL);
        BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
        String line;
        while ((line = in.readLine()) != null) {
            json+=line;
        }
        in.close();
        return true;
    } catch (Exception e) {
        return false;
    }
}

基本上它正确地打开缓冲区,它正确地读取json并将其存储在变量中,它关闭流,然后它返回true并且......它随机跳转到返回false而没有意义,而while它在返回false时异常e是... null Oo 这绝对没有意义,请帮助我D:!!!

最后我用这种方式解决了它:

public boolean downloadJSON(){
    json="";
    boolean out=false;
    try{
        URL url = new URL(theURL);
        BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
        String line;
        while ((line = in.readLine()) != null) {
            json+=line;
        }
        in.close();
        out = true;
    } catch (Exception e) {
    }
  return out;
}

如果第一个doesen工作,不要问我这是怎么回事,在我看来我仍然认为第一个应该有效:S

ADD:对于Stephen C:

public boolean downloadJSON(){
        json="";
        try{
            URL url = new URL("http://fapfapfap.altervista.org/conapo/conapo.php?n="+numeroPagina);
            BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
            String line;
            while ((line = in.readLine()) != null){json+=line;}
            in.close();
            return true;
        }catch (Exception e) {
            Log.d("ERRORE", e.getStackTrace().toString());
            return false;
        }
    }

2 个答案:

答案 0 :(得分:0)

试试这个:

URL url = new URL(theURL);
StringBuilder jsonResults = new StringBuilder();
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
InputStreamReader in = new InputStreamReader(conn.getInputStream());

            // Load the results into a StringBuilder
            int read;
            char[] buff = new char[1024];
            while ((read = in.read(buff)) != -1) {
                jsonResults.append(buff, 0, read);
            }

System.out.println(jsonResults.toString());

答案 1 :(得分:0)

  

....我的代码毫无例外地跳到了错误

仍然没有任何意义

你误解了证据:

public boolean downloadJSON(){
    json = "";
    try {
        URL url = new URL(theURL);
        BufferedReader in = new BufferedReader(
                new InputStreamReader(url.openStream()));
        String line;
        while ((line = in.readLine()) != null) {
            json += line;
        }
        in.close();
        return true;
    } catch (Exception e) {
        return false;  // HERE
    }
}

当您收到我已标记为// HERE的声明时。它已经发生>>因为<<抛出了一些例外。毫无疑问。我们不知道它是什么异常,因为你的代码只是抛弃了异常对象。

(尝试在e.printStacktace();之前添加return false;

我怀疑它要么是MalformedURLException,要么FileNotFoundException ......但可能是其他事情。

那么你在这段代码中的错误是什么?

1)捕获Exception是个坏主意。问题是它抓得太多了。除了捕获您(可能)此时预期的异常外,它还将捕获所有意外的异常。例如,任何NPE或AIOOPE或代码中(假设的)错误引起的任何错误。

在这种情况下,您应该抓住此时可能出现的异常;即IOException

2)捕获异常并丢弃堆栈跟踪会使诊断问题变得困难。只建议"壁球"如果你知道(并且可以证明)异常将是你所期望的那样的例外。

3)在同一段代码中同时执行1)和2)这是一个非常糟糕的主意。

4)构建一个像这样的字符串是低效的(或者非常低效......如果你正在加载一个非常大的文档)。使用StringBuilder要好得多。

但请注意,4)是您遇到问题的外围因素。