Java文件处理、if语句空指针异常及十六进制校验问题求助
一、空指针异常(NullPointerException)排查
devicesList未初始化
检查devicesList是否在使用前完成初始化,比如:List<SmartDevice> devicesList = new LinkedList<>(); // 根据实际类型初始化如果
devicesList为null,调用stream().anyMatch()时会直接抛出空指针异常。数组越界导致的间接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;
三、其他潜在问题修复
类名拼写错误
代码中实例化的SmartColorLamb应该是SmartColorLamp(和命令中的名称一致),否则会导致编译错误或类找不到的异常:SmartColorLamp smartColorLamp = new SmartColorLamp(deviceName, initialStatus, kelvin, brightness);无效十六进制字符处理
对于示例中的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

