2013-11-27 50 views
1

我试图构建我的第一个Android应用程序,用于我学校的新闻发布。我使用Jsoup,但每次都会崩溃。这个问题只发生在这个网页上。当我输入不同的网址时,它就可以工作。这里是链接的页面:http://www.marianum24.de/~aushang/index.html 这里是我的代码:解析某个特定网站时Android应用程序崩溃

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 

我希望你能告诉我问题所在。

+0

请仔细阅读错误日志。它显示你在第199行有一个空指针异常。 –

+0

可证明doc.body()为空,并且只捕获IOException。你必须明白为什么。此线程可能对您有用http://stackoverflow.com/questions/10245519/handling-connection-errors-and-jsoup – mihail

+0

我检查了连接,但代码是200,并且消息是“确定” – user3042432

回答

0

检查MainActivity 199行。那里有null

我敢打赌,在这条线:

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

我想doc可能是null

+0

对不起,我'在这一切新的 – user3042432

+0

哪部分你不明白? –

+0

我检查了Document是否为'null'。这似乎是好的,'butdoc.body()'为'null' – user3042432

0

您的问题似乎是一个验证问题。简而言之,您将原始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与网站。

如果我是你,我会运行一些检查来解析我的输入文件之前做任何处理。

+0

我现在做过。 'doc.body()'是'null',就像'doc.getElementsByClass(“MsoNormalTable”)'不是'null',但是当我尝试'doc.getElementsByClass(“MsoNormalTable”).text()',那里没有内容。 'doc.text()'也不是null,但是当我尝试获取文本时,它只包含“aushang”。我不能得到一个单一的元素,因为元素没有身份证。所以我能做什么? – user3042432

+0

它好像我能从身体中得到任何文字。但为什么? – user3042432

+0

就像我刚才提到的,你的源代码XML写得很糟糕。尽管HTML应该符合XML标准,但大多数Web浏览器都有自己的错误方案,这些方案使得这种错误变得不必要。为什么不读取NULL就跳过元素? – chronodekar