3

IllegalStateExceptionいくつかの変数がnullでないことを必要とするコードのチャンクを実行している場合、たとえば次のようなコンテンツプロバイダーdelete()関数で、Androidアプリケーションにをスローすることは有効でしょうか。

public int delete(Uri uri, String where, String[] whereArgs) {
    try {
        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
        int count;
        switch (sUriMatcher.match(uri)) {
            case NOTES:
                count = db.delete(NOTES_TABLE_NAME, where, whereArgs);
                break;

            case NOTE_ID:
                String noteId = uri.getPathSegments().get(1);
                count = db.delete(NOTES_TABLE_NAME, NoteColumns._ID + "=" + noteId
                    + (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""), whereArgs);
                break;

            default:
               throw new IllegalArgumentException("Unknown URI " + uri);
       }

       getContext().getContentResolver().notifyChange(uri, null);
       return count;

    } catch (NullPointerException e) {
       // We really shouldn't get any null pointers!
       throw new IllegalStateException();
    }
}

なぜなら、可能性は非常に低いですが、次の変数がNULLになる可能性はわずかです。

- mOpenHelper
- db
- getContext()
- getContentResolver()

それともこれは虐待IllegalStateExceptionですか?私がこれをやりたい理由は、この関数が単にスローするのは間違っているように見えるからNullPointerExceptionsです。

4

2 に答える 2

1

独自の例外を作成してみませんか?

public class MyCustomException extends NullPointerException {

    private static final long serialVersionUID = 1L;

    public Exception innerException;

    public MyCustomException() {}

    public MyCustomException(Exception innerException) {
        this.innerException = innerException;
    }
}

...

if (mOpenHelper == null){thrown new MyCustomException("mOpenHelper is null!");}

または、NPEをキャッチし、その理由を理解してから、自分で吐きます。

于 2012-11-19T11:20:37.037 に答える
1

少なくとも、throw new IllegalStateException(e);最初に例外の原因に関する情報を保持するために使用します。

個人的には、必要なすべての変数(mOpenHelperなど)を使用する前に適切に初期化されていることを確認して、NPEが発生しないようにします。

于 2012-11-19T12:07:06.177 に答える