《第一行代码(第二版)》7.4节 ProviderTest项目出错分析

点击 Add data按钮时程序闪退。

Logcat里显示出错信息为

java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.List android.net.Uri.getPathSegments()' on a null object reference.

调试时将 

newId = newUri.getPathSegments().get(1);

标注掉后,点击Add data 不闪退,

但点击 Query data 无输出。

结合出错信息“空指针”,猜想newUri没有被正确的赋值。inser操作没有生效。

检查DatabaseTest项目中自定义DatabaseProvider类的insert操作

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        // TODO: Implement this to handle requests to insert a new row.
        //throw new UnsupportedOperationException("Not yet implemented");
        SQLiteDatabase database = databaseHelper.getWritableDatabase();
        Uri uriReturn = null;
        switch (uriMatcher.match(uri)){
            case BOOK_DIR:
                 break;
            case BOOK_ITEM:
                long newBookId = database.insert("Book",null,values);
                uriReturn = Uri.parse("content://" + AUTHORITY + "/book/" + newBookId);
                break;
            case CATEGORY_DIR:
                break;
            case CATEGORY_ITEM:
               long newCategoryId = database.insert("Category",null,values);
               uriReturn = Uri.parse("content://" + AUTHORITY + "/category/" + newCategoryId);
                break;
            default:
                break;
        }
        return uriReturn;
    }

ProviderTest中使用的insert操作对应BOOK_DIR的操作,结果被赋值为空指针,自然出现空指针异常。

将break;标注掉后,ProviderTest项目运行效果与书上相同,错误解决;

总结:

  出错的原因为对switch-case语法的不熟悉,不同case的使用同一个操作时,可只写最后一个,中间不能加break。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值