如何检查JSONArray是否有值?日历事件删除及数字格式异常求助
我来帮你逐个解决这两个开发问题:
问题1:检查JSONArray是否包含有效值 & 解决NumberFormatException
这个报错太常见了——你肯定是在把JSONArray里的元素转成数字时,碰到了纯空白的字符串(就是那个" "),Java没法把空白内容转成数字,所以抛出了这个异常。
给你两个实用的处理思路:
- 遍历校验每个元素:先把每个元素转成字符串并去除首尾空格,确认不是空值后再转数字,提前过滤无效的空白项:
JSONArray yourJsonArray = ...; // 你的目标JSONArray对象 for (int i = 0; i < yourJsonArray.length(); i++) { String rawValue = yourJsonArray.optString(i); String trimmedValue = rawValue.trim(); if (!trimmedValue.isEmpty()) { try { // 根据需求转成int/long/double均可 int validNum = Integer.parseInt(trimmedValue); // 这里处理有效数字的业务逻辑 } catch (NumberFormatException e) { // 碰到非数字的有效字符串,比如"abc",可打日志或做降级处理 Log.d("JSONCheck", "无效数字元素:" + rawValue); e.printStackTrace(); } } else { // 处理空白/空字符串的情况 Log.d("JSONCheck", "第" + i + "个元素为空白/空值,跳过处理"); } }
- 结合JSON方法+异常捕获:如果你期望JSONArray内本就应该是数字类型,可以直接用
getInt()/optInt(),但记得捕获异常并打印出错的原始值方便排查:
try { int num = yourJsonArray.getInt(i); } catch (JSONException | NumberFormatException e) { String badValue = yourJsonArray.optString(i); Log.e("JSONError", "转数字失败,原始值:'" + badValue + "'"); e.printStackTrace(); }
问题2:删除日历事件时的RuntimeException解决
从日志来看,是启动Schedule_Delete Activity时崩溃了,根因大概率还是NumberFormatException(日志截断了,但结合你的操作流程,基本是event id的转换出问题)。给你几个排查和解决的关键点:
- 先确认event id的有效性
从数据库获取的event id可能是空白字符串、带空格的字符串,直接转数字必然报错,先加一层校验:
// 假设从Cursor中读取event id String eventIdStr = cursor.getString(cursor.getColumnIndex("event_id")).trim(); if (eventIdStr.isEmpty()) { Log.e("DeleteError", "数据库中的event id为空!"); return; } // 日历事件ID一般为long类型,转成对应类型 long eventId; try { eventId = Long.parseLong(eventIdStr); } catch (NumberFormatException e) { Log.e("DeleteError", "event id不是有效数字:" + eventIdStr); e.printStackTrace(); return; }
- 检查日历操作的权限与代码逻辑
Android日历操作需要申请READ_CALENDAR和WRITE_CALENDAR权限,Android 6.0以上还需动态申请。删除事件的标准代码示例:
ContentResolver contentResolver = getContentResolver(); // 拼接要删除的事件Uri Uri eventUri = ContentUris.withAppendedId(Events.CONTENT_URI, eventId); try { int rowsDeleted = contentResolver.delete(eventUri, null, null); if (rowsDeleted > 0) { Log.d("CalendarOps", "事件删除成功!"); } else { Log.w("CalendarOps", "未找到该ID对应的日历事件"); } } catch (SecurityException e) { Log.e("CalendarOps", "无日历操作权限!"); // 此处可弹出提示引导用户开启权限 } catch (Exception e) { Log.e("CalendarOps", "删除事件失败", e); }
- 排查Activity传参的问题
如果是从其他页面传递event id到Schedule_Delete,要确认参数传递是否正确:
// 跳转页面时传递有效参数 Intent deleteIntent = new Intent(this, Schedule_Delete.class); deleteIntent.putExtra("EVENT_ID", validEventId); // 确保是long类型或有效数字字符串 startActivity(deleteIntent); // 在Schedule_Delete中获取参数时校验有效性 long eventId = getIntent().getLongExtra("EVENT_ID", -1); if (eventId == -1) { Log.e("ScheduleDelete", "传递的event id无效!"); finish(); // 直接关闭页面,避免后续崩溃 return; }
内容的提问来源于stack exchange,提问作者selva surya




