0

私が夢中になっているのは、私のプログラムが try ブロックの途中で停止し、すべての catch ブロックの後に続くことです! 詳細はこちら。AsyncTask を取得しました

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() では、すべての catch ブロックに到達is.close()し、すぐにジャンプします。return nullしたがって、スキップしますreturn bitmap。この時点で例外はありませんでした。後で返されたビットマップが使用されたときにのみ、NPE を取得しました。何か案は?

4

4 に答える 4

2

まあ、デバッガーの行番号がずれていることがあるので、それが問題なのかもしれません。クリーンビルドを行います。また、is.close() を最終的にブロックするように移動します。リソースを適切に破棄することを確認するために、一般的には良い考えです。したがって、次のようになります。

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

あなたがそれを見ないNullPointerExceptionから、それは失敗しています。fromisで例外が発生した場合、または例外が飲み込まれた場合 (UncaughtExceptionHandler が設定されていない場合)。 AsyncTask は、非同期実行のために ExecutorService を使用します (または、少なくとも最後に確認しました)。ExecutorServiceCallableRunnable

doInBackground別のスレッドで実行されます。RuntimeException が発生した場合、指定されていない場所には出力されません (つまり、例外を飲み込みます)。

3 番目の catch ブロックを追加することをお勧めします

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

つまり、InputStream はおそらく null です。

于 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 に答える