0

让我抓狂的是,我的程序在 try 块中间停止,在所有 catch 块之后继续!以下是详细信息。我有异步任务

public class BigBitmapLoader extends AsyncTask<Uri, Void, Bitmap>
{

    public BigBitmapLoader(ScribblesView scribbles)
    {
        scribblesRef = new WeakReference<ScribblesView>(scribbles);
    }

    @Override
    protected Bitmap doInBackground(Uri... params)
    {
        InputStream is;
        try
        {
            ScribblesView scribs = scribblesRef.get();
            if (scribs != null)
            {
                is = scribs.getContext().getContentResolver().openInputStream(params[0]);
                Bitmap bitmap = BitmapFactory.decodeStream(is);
                is.close();
                return bitmap;
            }
        }
        catch(FileNotFoundException e)
        {
            Log.e(ERROR_TAG, e.toString());
        }
        catch(IOException e)
        {
            Log.e(ERROR_TAG, e.toString());
        }
        return null;
    }

    @Override
    protected void onPostExecute(Bitmap bitmap)
    {
        ScribblesView scribs = scribblesRef.get();
        if (scribs != null) scribs.setBigBitmap(bitmap);
    }

    private WeakReference<ScribblesView> scribblesRef;

    private static final String ERROR_TAG = "BigBitmapLoader";

}

在 doInBackground() 中,它到达is.close()然后立即跳转到return null所有 catch 块之后。因此它跳过return bitmap。在这一点上,我没有例外。只有稍后使用返回的位图时,我才得到 NPE。有任何想法吗?

4

4 回答 4

2

好吧,调试器的行号有时会关闭,所以也许这就是问题所在。做一个干净的构建。另外,我会将 is.close() 移动到 finally 块。一般来说,这是一个好主意,以确保您正确处置资源。所以它会是这样的:

InputStream is = null;
try
    {
     // do stuff
} catch(FileNotFoundException e)
{
    Log.e(ERROR_TAG, e.toString());
} catch(IOException e) {
    Log.e(ERROR_TAG, e.toString());
} finally {
  if (is != null) {
     is.close();
  }
}
于 2013-11-06T17:08:18.787 回答
2

它失败了,因为NullPointerExceptionis只是看不到它。当ExecutorServicefrom a中发生异常CallableRunnable异常被吞下时(除非设置了 UncaughtExceptionHandler)。 注意AsyncTask 使用(或至少我上次检查) ExecutorService 进行异步执行。

doInBackground将在另一个线程上运行,如果发生 RuntimeException,它将不会在未指定的任何地方打印(即吞下异常)。

我建议你添加第三个 catch 块

} catch(RuntimeException ex){
   ex.printStackTrace(); //or log
}

简而言之,InputStream 可能为空。

于 2013-11-06T17:21:08.163 回答
1

您看不到异常,因为没有发生异常

        ScribblesView scribs = scribblesRef.get();
        if (scribs != null)
        {
            is = scribs.getContext().getContentResolver().openInputStream(params[0]);
            Bitmap bitmap = BitmapFactory.decodeStream(is);
            is.close();
            return bitmap;  // return statement
        }

return 语句可能返回 null。尝试调试方法“decodeStream”

于 2013-11-06T16:45:28.553 回答
0

原因是我在主线程上有一个异常。但是日志中没有链接。在这里if (scribs != null) scribs.setBigBitmap(bitmap);setBigBitmap()我使用了未初始化的变量。修复它并且一切正常。但是调试器仍然“跳跃”。可能是 Eclipse 的调试器中的一些错误,因为现在它返回了一个正确的值。并且以前做过。它只是未初始化的变量。谢谢大家的答案)

于 2013-11-06T17:59:50.400 回答