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

Java文件处理、if语句空指针异常及十六进制校验问题求助

问题排查与解决

一、空指针异常(NullPointerException)排查

  1. devicesList未初始化
    检查devicesList是否在使用前完成初始化,比如:

    List<SmartDevice> devicesList = new LinkedList<>(); // 根据实际类型初始化
    

    如果devicesList为null,调用stream().anyMatch()时会直接抛出空指针异常。

  2. 数组越界导致的间接NPE
    在访问parts[2]、parts[3]等元素前,先校验数组长度:

    if (parts.length < 3) {
        System.out.println("ERROR: Invalid Add command format!");
        return;
    }
    

    避免因制表符分割后数组长度不足,访问不存在的元素抛出异常。

二、十六进制校验与解析逻辑错误修正

当前代码的十六进制处理存在3个核心问题,逐一修复:

1. 正则表达式未匹配0x前缀

用户的十六进制数据带0x前缀,原正则^[0-9A-Fa-f]+$无法匹配,修改为:

parts[4].matches("^0x[0-9A-Fa-f]+$")

如果需要兼容大写0X,可以改为^0[xX][0-9A-Fa-f]+$。

2. 两个if语句重复执行,覆盖值

原代码中两个独立的if (parts.length >4)会先后执行,导致十六进制解析后又被十进制解析覆盖,改为else if:

if (parts.length >4 && parts[4].matches("^0x[0-9A-Fa-f]+$")) {
    // 解析十六进制颜色码
    try {
        kelvin = Integer.parseInt(parts[4].substring(2), 16); // 去掉0x前缀,按16进制解析
    } catch (NumberFormatException e) {
        System.out.println("ERROR: Invalid hex color code format!");
        return;
    }
} else if(parts.length >4) {
    // 解析 kelvin 温度
    try {
        kelvin = Integer.parseInt(parts[4]);
    } catch (NumberFormatException e) {
        System.out.println("ERROR: Invalid kelvin or color code format!");
        return;
    }
}

3. 十六进制解析未指定基数

原代码用Integer.parseInt(parts[4])解析带0x的十六进制字符串会直接抛出NumberFormatException,必须去掉前缀后指定基数16,如上面代码所示。

另外,注意用户示例中的0xFFFFFFF是7位十六进制数,超过int类型的最大值(0x7FFFFFFF),会导致解析错误,建议添加范围校验:

int hexValue = Integer.parseInt(parts[4].substring(2), 16);
if (hexValue < 0 || hexValue > 0xFFFFFF) { // RGB颜色码范围0~0xFFFFFF
    System.out.println("ERROR: Hex color code out of valid range!");
    return;
}
kelvin = hexValue;

三、其他潜在问题修复

  1. 类名拼写错误
    代码中实例化的SmartColorLamb应该是SmartColorLamp(和命令中的名称一致),否则会导致编译错误或类找不到的异常:

    SmartColorLamp smartColorLamp = new SmartColorLamp(deviceName, initialStatus, kelvin, brightness);
    
  2. 无效十六进制字符处理
    对于示例中的0x00GG00,正则会匹配失败,进入else if的十进制解析分支,抛出NumberFormatException,触发错误提示,这部分逻辑是正常的。

修正后的完整代码片段

if (parts[0].equals("Add") && parts[1].equals("SmartColorLamp")) {
    int kelvin = 4000;
    int brightness = 100;

    if (!initialTimeSet) {
        System.out.println("COMMAND: " + line);
        System.out.println("ERROR: First command must be SetInitialTime! Program is going to terminate!");
        System.exit(0);
    }

    // 校验数组长度,避免越界
    if (parts.length < 3) {
        System.out.println("COMMAND: " + line);
        System.out.println("ERROR: Invalid Add command format!");
        return;
    }

    if (parts.length > 3 && !parts[3].equalsIgnoreCase("On") && !parts[3].equalsIgnoreCase("Off")) {
        System.out.println("COMMAND: " + line);
        System.out.println("ERROR: Erroneous command!");
        return;
    }

    String initialStatus = "Off";
    if (parts.length > 3) {
        initialStatus = parts[3];
    }

    String deviceName = parts[2];
    // 确保devicesList已初始化
    if (devicesList == null) {
        System.out.println("ERROR: Devices list not initialized!");
        return;
    }
    boolean isAlreadyExists = devicesList.stream().anyMatch(device -> device.getName().equals(deviceName));

    if (isAlreadyExists) {
        System.out.println("ERROR: There is already a smart device with the same name!");
    } else {
        if (parts.length > 4 && parts[4].matches("^0x[0-9A-Fa-f]+$")) {
            // 解析十六进制颜色码
            try {
                String hexStr = parts[4].substring(2);
                int hexValue = Integer.parseInt(hexStr, 16);
                if (hexValue < 0 || hexValue > 0xFFFFFF) {
                    System.out.println("ERROR: Hex color code out of valid range (0~0xFFFFFF)!");
                    return;
                }
                kelvin = hexValue;
            } catch (NumberFormatException e) {
                System.out.println("ERROR: Invalid hex color code format!");
                return;
            }
        } else if (parts.length > 4) {
            // 解析kelvin温度
            try {
                kelvin = Integer.parseInt(parts[4]);
                // 可添加kelvin的合理范围校验,比如2000~6500
                if (kelvin < 2000 || kelvin > 6500) {
                    System.out.println("ERROR: Kelvin temperature must be in range 2000~6500!");
                    return;
                }
            } catch (NumberFormatException e) {
                System.out.println("ERROR: Invalid kelvin or color code format!");
                return;
            }
        }

        if (parts.length > 5) {
            try {
                brightness = Integer.parseInt(parts[5]);
                if (brightness < 0 || brightness > 100) {
                    System.out.println("ERROR: Brightness must be in range of 0%-100%!");
                    return;
                }
            } catch (NumberFormatException e) {
                System.out.println("ERROR: Invalid Brightness format!");
                return;
            }
        }

        // 修正类名拼写
        SmartColorLamp smartColorLamp = new SmartColorLamp(deviceName, initialStatus, kelvin, brightness);
        devicesList.add(smartColorLamp);
        System.out.println("SUCCESS: Smart Color lamp has been added to the devices list!");
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 06:15:44