【问题标题】:Android app crashes when parsing one specific website解析一个特定网站时,Android 应用程序崩溃
【发布时间】:2013-11-28 01:35:18
【问题描述】:

我尝试构建我的第一个 Android 应用程序,用于我学校的新闻报道。我使用了 Jsoup,但应用程序每次都崩溃。该问题仅出现在此网页上。当我输入不同的网址时,它可以工作。这是该页面的链接:http://www.marianum24.de/~aushang/index.html 这是我的代码:

private String loadXmlFromNetwork(String urlString) throws IOException {

    Document doc = null;
    StringBuilder htmlString = new StringBuilder();

    try {
        doc = Jsoup.connect(urlString).get();
        htmlString.append(doc.body().text());
   } catch (IOException e) {
       return getResources().getString(R.string.connection_error);
   }

    return htmlString.toString();
}

最后是我的日志:

11-27 11:30:33.081: D/gralloc_goldfish(5227): Emulator without GPU emulation detected.
11-27 11:30:35.251: D/dalvikvm(5227): GC_FOR_ALLOC freed 149K, 9% free 2768K/3024K, paused 51ms, total 51ms
11-27 11:30:36.292: D/dalvikvm(5227): GC_FOR_ALLOC freed 398K, 15% free 2881K/3380K, paused 50ms, total 51ms
11-27 11:30:37.411: D/dalvikvm(5227): GC_FOR_ALLOC freed 181K, 9% free 3215K/3496K, paused 59ms, total 59ms
11-27 11:30:37.952: W/dalvikvm(5227): threadid=12: thread exiting with uncaught exception (group=0x414c4700)
11-27 11:30:37.971: E/AndroidRuntime(5227): FATAL EXCEPTION: AsyncTask #1
11-27 11:30:37.971: E/AndroidRuntime(5227): java.lang.RuntimeException: An error occured while executing doInBackground()
11-27 11:30:37.971: E/AndroidRuntime(5227):     at android.os.AsyncTask$3.done(AsyncTask.java:299)
11-27 11:30:37.971: E/AndroidRuntime(5227):     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
11-27 11:30:37.971: E/AndroidRuntime(5227):     at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
11-27 11:30:37.971: E/AndroidRuntime(5227):     at java.util.concurrent.FutureTask.run(FutureTask.java:239)
11-27 11:30:37.971: E/AndroidRuntime(5227):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
11-27 11:30:37.971: E/AndroidRuntime(5227):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
11-27 11:30:37.971: E/AndroidRuntime(5227):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
11-27 11:30:37.971: E/AndroidRuntime(5227):     at java.lang.Thread.run(Thread.java:841)
11-27 11:30:37.971: E/AndroidRuntime(5227): Caused by: java.lang.NullPointerException
11-27 11:30:37.971: E/AndroidRuntime(5227):     at com.boldog.aushang.MainActivity.loadXmlFromNetwork(MainActivity.java:199)
11-27 11:30:37.971: E/AndroidRuntime(5227):     at com.boldog.aushang.MainActivity.access$0(MainActivity.java:192)
11-27 11:30:37.971: E/AndroidRuntime(5227):     at com.boldog.aushang.MainActivity$DownloadXmlTask.doInBackground(MainActivity.java:175)
11-27 11:30:37.971: E/AndroidRuntime(5227):     at com.boldog.aushang.MainActivity$DownloadXmlTask.doInBackground(MainActivity.java:1)
11-27 11:30:37.971: E/AndroidRuntime(5227):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
11-27 11:30:37.971: E/AndroidRuntime(5227):     at java.util.concurrent.FutureTask.run(FutureTask.java:234)
11-27 11:30:37.971: E/AndroidRuntime(5227):     ... 4 more
11-27 11:30:42.774: I/Choreographer(5227): Skipped 78 frames!  The application may be doing too much work on its main thread.
11-27 11:31:28.801: I/Process(5227): Sending signal. PID: 5227 SIG: 9

希望你能告诉我问题出在哪里。

【问题讨论】:

  • 请务必阅读错误日志。它表明您在第 199 行有一个空指针异常。
  • 可证明 doc.body() 为空,而您只捕获 IOException。你必须看看为什么。这个帖子可能对你有用stackoverflow.com/questions/10245519/…
  • 我检查了连接,但代码是 200 并且消息是“OK”

标签: java android android-asynctask crash jsoup


【解决方案1】:

在第 199 行检查 MainActivity。那里有 null 的东西。

我的赌注在这条线上:

htmlString.append(doc.body().text());

我认为doc 可能是null

【讨论】:

  • 对不起,我是新手
  • 哪一部分没看懂?
  • 我检查了文档是否为“空”。似乎没问题,'butdoc.body()' is 'null'
  • 好。这意味着文档正文为空。您需要对此进行检查,否则您的应用会崩溃。
  • 是的,但是为什么正文是空的,我该怎么做才能获取数据?
【解决方案2】:

您的问题似乎是验证问题。简单地说,您将原始 HTML 文件传递​​给 Document 对象,就好像它是正确格式化的 XML 一样。它不是。根据 w3.org 验证服务,

http://validator.w3.org/check?uri=http%3A%2F%2Fwww.marianum24.de%2F~aushang%2Findex.html&charset=%28detect+automatically%29&doctype=Inline&group=0

目前该网站至少有 8 个错误和 1 个警告。

如果我是你,我会先运行一些检查来解析我的输入文档,然后再对它进行任何处理。

【讨论】:

  • 我现在做到了。 doc.body()null ,类似 doc.getElementsByClass("MsoNormalTable") 不是 null ,但是当我尝试 doc.getElementsByClass("MsoNormalTable").text() 时,没有内容。 doc.text() 也不为空,但是当我尝试获取文本时,它只包含 "aushang" 。我无法获得一个元素,因为这些元素没有 ID。那我该怎么办?
  • 似乎我无法从正文中获取任何文本。但为什么呢?
  • 就像我提到的,您的源 XML 写得不好。虽然 HTML 应该与 XML 兼容,但大多数 Web 浏览器都有自己的错误纠正方案,这使得这变得不必要。如果您阅读 NULL,为什么不直接跳过该元素?
  • 但整个正文为空,我无法从文档中获取任何有效元素。有没有可能得到数据?
猜你喜欢
  • 2013-04-21
  • 2013-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多