3

IllegalStateException如果我正在执行一段需要许多变量不为空的代码,例如在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?我想这样做的原因是因为对我来说这个函数只是 throw 似乎是错误的NullPointerExceptions

4

2 回答 2

1

至少,用于throw new IllegalStateException(e);保留有关导致异常的原因的信息。

我个人会通过确保在我需要使用它们之前正确初始化所有必需的变量(mOpenHelper 等)来确保不会发生 NPE。

于 2012-11-19T12:07:06.177 回答
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 回答