在EditQuickin类更新SQLite数据时触发NumberFormatException,求解决方案
让我来帮你拆解这个问题——你遇到的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

