对于 Android 应用程序,由于新的服务器,我尝试更改 XML 的 URL,但内容是相同的。 我曾经这样做过:
InputSource ins = new InputSource(rssUrl.openStream());
这曾经有效,并且在几天内仍然有效,而旧 URL 在旧服务器上可用。但是当我更改 XML 的 URL 时,我在上面的行中收到 NullPointerException。
我确信 rssUrl 不为空,我打印了它的值,这只是工作 URL。我验证了 XMl 并且 XML 是有效的,但这并不重要,因为问题是在解析开始之前出现的。
我尝试过的事情之一是这样的:
Urlconnection urlConnection= rssUrl.openurlconnection();
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
inputsource ins = new inputsource(in);
但这也引发了空指针异常。
我读了一些东西about downgrading my Java to 6 (目前我正在使用7)。但我真的不喜欢它,也无法想象为什么它会起作用。
编辑: 我尝试降级到 java se 6 但没有成功。
有谁知道这个错误是如何发生的以及如何解决它?
堆栈:
12-28 22:14:53.635: W/System.err(6949): java.lang.NullPointerException
12-28 22:14:53.725: W/System.err(6949): at libcore.net.http.HttpConnection$Address.hashCode(HttpConnection.java:343)
12-28 22:14:53.725: W/System.err(6949): at java.util.HashMap.get(HashMap.java:298)
12-28 22:14:53.725: W/System.err(6949): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:67)
12-28 22:14:53.725: W/System.err(6949): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
12-28 22:14:53.725: W/System.err(6949): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308)
12-28 22:14:53.725: W/System.err(6949): at libcore.net.http.HttpEngine.connect(HttpEngine.java:303)
12-28 22:14:53.735: W/System.err(6949): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
12-28 22:14:53.735: W/System.err(6949): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
12-28 22:14:53.735: W/System.err(6949): at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273)
12-28 22:14:53.735: W/System.err(6949): at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168)
12-28 22:14:53.735: W/System.err(6949): at java.net.URL.openStream(URL.java:462)
12-28 22:14:53.735: W/System.err(6949): at com.hera.ontdekdelft.StartUp$LoadData.doInBackground(StartUp.java:610)
12-28 22:14:53.735: W/System.err(6949): at com.hera.ontdekdelft.StartUp$LoadData.doInBackground(StartUp.java:1)
12-28 22:14:53.735: W/System.err(6949): at android.os.AsyncTask$2.call(AsyncTask.java:264)
12-28 22:14:53.735: W/System.err(6949): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
12-28 22:14:53.735: W/System.err(6949): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
12-28 22:14:53.735: W/System.err(6949): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
12-28 22:14:53.735: W/System.err(6949): at j.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
12-28 22:14:53.735: W/System.err(6949): at java.lang.Thread.run(Thread.java:856)
ava.util
解决方案
URL 中的下划线导致 android 失败。我的解决方案是编辑 XML 文件的 url,以便 rssUrl.openstream() 再次工作。问题解决了,感谢Kiruwka
最佳答案
根据您提供的跟踪,uri.getHost()
似乎为 null,从内部实现向您抛出 NPE
。您可以通过输出来验证它是否为空:
Log.d(TAG, "host = " + rssUrl.getHost());
在打开连接之前。如果为空,请修复您的网址。
更新
当主机字符串包含空格或“_”字符时,我看到了几个类似的问题,例如 this known bug ,或This solution对于下划线符号问题。
关于java - url.openstream() 或 urlconnection.getinputstream() 在有效 URL 上引发 nullpointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20817383/