You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何检查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的转换出问题)。给你几个排查和解决的关键点:

  1. 先确认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;
}
  1. 检查日历操作的权限与代码逻辑
    Android日历操作需要申请READ_CALENDARWRITE_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);
}
  1. 排查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

火山引擎 最新活动