You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在EditQuickin类更新SQLite数据时触发NumberFormatException,求解决方案

解决SQLite更新时的NumberFormatException: Invalid int: "null"问题

让我来帮你拆解这个问题——你遇到的java.lang.NumberFormatException: Invalid int: "null",本质是某个需要整数类型的地方,被传入了字符串"null",结合你的代码片段,大概率出在从EditText取值转整数、或者从QuickinModel获取数值字段时的处理逻辑上。下面是具体的排查和解决步骤:

1. 先确认Intent传递的QuickinModel是否有效

你从Intent获取序列化对象的代码没有做null判断,如果传递的对象本身是null,后续调用quickinModel.getFullName()等方法虽然不会直接崩溃,但如果Model里的数值字段(比如dgnNumber)是null,填充到EditText后会显示字符串"null",后续转int就会报错。

先给获取Model的代码加上null校验:

QuickinModel quickinModel = (QuickinModel) getIntent().getSerializableExtra(Quickin.QUICKIN_EXTRA);
// 先判断Model是否为空
if (quickinModel == null) {
    Toast.makeText(this, "数据加载失败,请重试", Toast.LENGTH_SHORT).show();
    finish(); // 直接返回,避免后续空指针或错误
    return;
}
// 再继续填充控件
FullName.setText(quickinModel.getFullName());
// 注意:如果dgnNumber是Integer类型(允许null),填充时要处理null情况
String dgnText = quickinModel.getDgnNumber() == null ? "" : String.valueOf(quickinModel.getDgnNumber());
DgnNumber.setText(dgnText);

2. 安全处理EditText转整数的逻辑

保存数据时,你大概率直接把DgnNumber的文本转成int,但如果文本是空或者是"null"(比如Model传递的就是null,你没处理直接setText),就会触发NumberFormatException。

修改取值转int的逻辑,加上校验和异常捕获:

Save.setOnClickListener(v -> {
    String fullName = FullName.getText().toString().trim();
    String dgnStr = DgnNumber.getText().toString().trim();
    
    // 处理dgnNumber的转换
    Integer dgnNumber = null;
    if (!dgnStr.isEmpty() && !dgnStr.equalsIgnoreCase("null")) {
        try {
            dgnNumber = Integer.parseInt(dgnStr);
        } catch (NumberFormatException e) {
            Toast.makeText(this, "请输入有效的编号(数字)", Toast.LENGTH_SHORT).show();
            return; // 输入无效,终止保存
        }
    }
    
    // 更新QuickinModel的字段
    quickinModel.setFullName(fullName);
    quickinModel.setDgnNumber(dgnNumber);
    
    // 调用DbController的更新方法
    db.updateQuickin(quickinModel);
});

3. 修正DbController中的数据库更新逻辑

确保DbController在处理数值字段时,正确处理null情况,不要把字符串"null"写入数据库,也不要尝试把"null"转成int。

比如用ContentValues更新时,处理null的方式:

public void updateQuickin(QuickinModel quickinModel) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    
    values.put("full_name", quickinModel.getFullName());
    // 处理可空的数值字段
    if (quickinModel.getDgnNumber() == null) {
        values.putNull("dgn_number"); // 写入SQLite的NULL值
    } else {
        values.put("dgn_number", quickinModel.getDgnNumber());
    }
    
    // 按ID更新(假设你的表有主键id)
    db.update("quickin_table", values, "id = ?", new String[]{String.valueOf(quickinModel.getId())});
    db.close();
}

另外,从数据库查询生成QuickinModel时,也要正确处理null的数值字段,避免把SQLite的NULL转成字符串"null":

// 示例查询逻辑
public QuickinModel getQuickinById(int id) {
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.query("quickin_table", null, "id = ?", new String[]{String.valueOf(id)}, null, null, null);
    
    QuickinModel model = null;
    if (cursor.moveToFirst()) {
        model = new QuickinModel();
        model.setId(cursor.getInt(cursor.getColumnIndex("id")));
        model.setFullName(cursor.getString(cursor.getColumnIndex("full_name")));
        // 处理可空的dgn_number字段
        if (!cursor.isNull(cursor.getColumnIndex("dgn_number"))) {
            model.setDgnNumber(cursor.getInt(cursor.getColumnIndex("dgn_number")));
        } else {
            model.setDgnNumber(null);
        }
    }
    cursor.close();
    db.close();
    return model;
}

4. 检查QuickinModel的字段类型

确保你的QuickinModel中,允许为null的数值字段用Integer类型(引用类型),而不是int(基本类型,不能为null)。比如:

public class QuickinModel implements Serializable {
    private int id;
    private String fullName;
    private Integer dgnNumber; // 用Integer而不是int,允许null
    
    // 对应的getter和setter
    public Integer getDgnNumber() {
        return dgnNumber;
    }
    
    public void setDgnNumber(Integer dgnNumber) {
        this.dgnNumber = dgnNumber;
    }
}

总结

这个错误的核心是字符串"null"被错误地当成整数来转换,可能的触发点包括:

  • Intent传递的QuickinModel为null,导致填充EditText时显示"null"
  • 数值字段用了基本类型int,无法处理数据库中的NULL值
  • 转整数时没有校验空字符串或"null"字符串
  • DbController中没有正确处理NULL值的写入

按照上面的步骤逐一排查修正,应该就能解决崩溃问题。

内容的提问来源于stack exchange,提问作者Umar Saidu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 02:32:29