我收到有关Google Play中某个应用的崩溃报告。我使用asynctask来获取图像,它适用于我测试过的每个设备,但也有一些用户遇到问题。这是非常罕见的,但我需要调试和解决这个问题。这是doInBackground方法:AsyncTask崩溃报告
public class MetaTask extends AsyncTask<Void, Void, Void> {
URL imageurl;
@Override
protected Void doInBackground(Void... params) {
try {
doc = Jsoup.connect(data).get();
Elements meta = doc.select("meta[property=og:image]");
for (Element element : meta) {
extracted = element.attr("content");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
imageurl = new URL(extracted);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
bitmap = BitmapFactory.decodeStream(imageurl.openConnection()
.getInputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
的空指针似乎是在这条线(271):
bitmap = BitmapFactory.decodeStream(imageurl.openConnection()
.getInputStream());
我想出于某种原因变量IMAGEURL不beeing一个实际的URL时,我唯一能想到的就是检查包含“http”和“jpg”的字符串变量,如果这些变量不存在,则使用Flurry存储这些信息。
在执行asynctask之前,会检查互联网连接的可用性,以免造成这种情况。
任何人都可以想到别的东西造成这种情况吗?这里的崩溃报告我的完整堆栈跟踪记录:
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:278)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)
Caused by: java.lang.NullPointerException
at com.ddroid.photosaveinstagram.MainActivity$MetaTask.doInBackground(MainActivity.java:271)
at com.ddroid.photosaveinstagram.MainActivity$MetaTask.doInBackground(MainActivity.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:264)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
... 5 more
如果您在try块中记录imageURl,它是否为空? –
是的,我可以尝试使用Flurry。问题是,我在9台设备上进行了测试。它一直有效,但是这些来自用户。 –
你的错误来自滥用try/catch来压制/忽略异常。例外情况不应该被忽视,但应该处理。当一个点出现异常(在您的情况下为'imageUrl')并且需要此值时,整个块的执行将被停止。你不应该执行代码,这取决于你压制但没有正确处理的try/catch中的变量/对象。 – Tseng