Android业务开发中assert的使用

1. assert(boolean)

        官方解释是:Throws an AssertionError if the value is false and runtime assertions have been enabled on the JVM using the -ea JVM option.

        简单理解是:用来检测执行结果,当boolean为false时,抛出AssertionError,但是需要在开启对应的JVM选项(-ea)时才生效。

2. 使用assert的好处

        减少在编码的时候,做的很多ifelse检测判断,以及减少代码层级。比如:某个变量是否为null,某个成员属性是否为true等。

3. assert代码使用

    override fun convert(helper: BaseViewHolder, item: MultiItemEntity?) {
        assert(item is WrapperMultiItemEntity)
        val data = item as WrapperMultiItemEntity
        assert(data.data != null)

        when (helper.itemViewType) {
            MAP.value -> convertExperience(helper, data.data as RecommendInfo)
        }
    }

4. assert思考

        之前我们一般是在写单测时才使用到assert,那么在业务代码中使用它是否会产生副作用呢?下面看看反编译后代码:

4.1 Objects.requireNonNull 

Checks that the specified object reference is not null and throws a customized NullPointerException if it is. This method is designed primarily for doing parameter validation in methods and constructors with multiple parameters, as demonstrated below:
       public Foo(Bar bar, Baz baz) {
           this.bar = Objects.requireNonNull(bar, "bar must not be null");
           this.baz = Objects.requireNonNull(baz, "baz must not be null");
       }
       
Params:
    obj – the object reference to check for nullity message – detail message to be used in the event that a NullPointerException is thrown
Type parameters:    <T> – the type of the reference
Returns:    obj if not null
Throws:    NullPointerException – if obj is null

    public static <T> T requireNonNull(T obj, String message) {
        if (obj == null)
            throw new NullPointerException(message);
        return obj;
    }

4.2 release版本与debug版本的差异

        可以看到,断言为false时,debug版本会抛出AssertionError,且当数据异常时,会抛出new NullPointerException异常。

        而对于release版本,并未抛出AssertionError,也就是说并为对assert语句进行断言,当数据异常时,相应的使用Objects.requireNonNull代替new NullPointerException去抛出异常,所以如果数据存在异常,还是会抛出的。

        对于debug和release版本的代码不一致,应该是因为release打包时并未开启JVM的-es(ps:根据调试现象和反编译代码猜测如此,不一定准确)

 5.0 小结

        综上所述,业务代码中可以使用assert进行编码,以减少ifelse的判断和代码层级。

附:参考【用好 Require,check,assert,写好 Kotlin 代码 - 云+社区 - 腾讯云

如有不对,敬请指出,谢谢。

### 如何在 Android Studio 中使用 SQLite 数据库 #### 创建 `SQLiteOpenHelper` 类 为了管理数据库的创建和版本管理,在应用程序中通常需要继承 `SQLiteOpenHelper` 并重写其抽象方法。此类提供了获取可读或可写的 `SQLiteDatabase` 对象的方法,用于执行 SQL 命令。 ```java public class MyDatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "mydatabase.db"; private static final int DATABASE_VERSION = 1; public MyDatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { // 执行建表语句 db.execSQL("CREATE TABLE users (id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL, password TEXT NOT NULL);"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 当升级数据库时调用此函数 db.execSQL("DROP TABLE IF EXISTS users;"); onCreate(db); } } ``` 这段代码定义了一个名为 `MyDatabaseHelper` 的类[^1]。 #### 插入数据到 SQLite 数据库 通过获得一个 `WritableDatabase` 实例可以向数据库插入新记录: ```java ContentValues values = new ContentValues(); values.put("username", "example_user"); values.put("password", "secure_password"); // 获取 writable database 和 insert 方法返回值表示是否成功插入 long newRowId; try (SQLiteDatabase db = myDbHelper.getWritableDatabase()) { newRowId = db.insert("users", null, values); } if(newRowId != -1){ Log.d("Insert","Data Inserted Successfully"); } else{ Log.e("Insert","Error while inserting data"); } ``` 上述代码展示了如何利用 `ContentValues` 将键值对封装起来并调用 `insert()` 函数完成数据插入操作。 #### 查询 SQLite 数据库中的数据 要查询已有的数据条目,可以通过 `query()` 或者更简单的 `rawQuery()` 来实现: ```java String[] projection = {"id", "username"}; Cursor cursor = null; try (SQLiteDatabase db = myDbHelper.getReadableDatabase()){ cursor = db.query( "users", projection, null, null, null, null, null); while(cursor.moveToNext()){ long id = cursor.getLong(cursor.getColumnIndexOrThrow("id")); String name = cursor.getString(cursor.getColumnIndexOrThrow("username")); Log.v("Read from DB:", "ID=" + id + ", Name="+name ); } } assert cursor != null; cursor.close(); // 关闭游标释放资源 ``` 这里说明了怎样构建投影参数列表以及遍历结果集的方式。 #### 查看 SQLite 数据库文件 对于开发者来说,在开发过程中能够方便地查看 SQLite 文件是非常有帮助的。当尝试直接点击项目视图下的 `.db` 文件时可能会遇到编码问题,这时应该按照提示安装相应的插件以便正确解析这些二进制文件[^2]。 #### 定义实体 Bean 类 为了让业务逻辑层更好地处理来自持久化的对象模型,往往还需要编写像 `UserBean` 这样的 JavaBeans: ```java package com.example.sqlitedemo; public class UserBean { private int id; private String username; private String password; // Getters and Setters... public int getId() {return id;} public void setId(int id) {this.id = id;} public String getUsername() {return username;} public void setUsername(String username) {this.username = username;} public String getPassword() {return password;} public void setPassword(String password) {this.password = password;} } ``` 这个例子给出了一个典型的 POJO(Plain Old Java Object),它映射到了之前提到过的 `users` 表结构上[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值