技术问询:非空返回处理及二维数组行求和劣质代码优化
Hey there! Let's break down your two technical requests clearly—first addressing non-null value handling, then refactoring that messy Java code for row sums in a 2D array.
1. 处理非null值相关问题
Non-null issues pop up all over the place, so here are practical fixes for common scenarios:
- 方法参数校验:在方法入口处对关键参数做null检查,用Java的
Objects.requireNonNull()快速抛出明确异常,避免后续空指针崩溃。示例:Objects.requireNonNull(inputArray, "输入的二维数组不能为null"); - 集合元素过滤:处理集合时,先过滤掉null元素再操作,用Stream API实现更简洁:
List<String> nonNullItems = originalList.stream() .filter(Objects::nonNull) .toList(); - 外部返回值处理:对于数据库或接口返回的对象,用
Optional包装来安全访问字段,避免多层if-null嵌套:String fieldValue = Optional.ofNullable(apiResponse) .map(Response::getTargetField) .orElse("默认值");
2. Java二维数组行求和代码优化与分析
首先,先点明你原代码的核心问题:
- 硬编码了固定的
numArray,完全忽略方法参数array,导致方法只能处理这一组固定数据,毫无通用性- 手动声明
rowTotal、row2Total、row3Total三个变量,扩展性极差,数组行数变化时必须修改代码新增变量- 循环只遍历第一行的长度,假设所有行长度一致,没有做行null或长度不一致的校验,容易触发空指针或计算错误
- 直接在方法内混合计算和输出,违反单一职责原则,方法应该只负责计算逻辑,输出交给调用方
优化版(基础安全型)
这个版本兼顾通用性、安全性和代码规范:
import java.util.Objects; public class ArraySumHandler { // 仅负责计算每行的和,单一职责 public static int[] calculateRowSums(int[][] array) { // 前置校验:输入数组不能为null Objects.requireNonNull(array, "输入的二维数组不能为null"); int[] rowSums = new int[array.length]; for (int rowIdx = 0; rowIdx < array.length; rowIdx++) { int[] currentRow = array[rowIdx]; // 处理行为null的情况,默认该行和为0 if (currentRow == null) { rowSums[rowIdx] = 0; continue; } int sum = 0; for (int num : currentRow) { sum += num; } rowSums[rowIdx] = sum; } return rowSums; } // 单独负责格式化输出 public static void printRowSums(int[] sums) { Objects.requireNonNull(sums, "求和结果数组不能为null"); StringBuilder output = new StringBuilder("("); for (int i = 0; i < sums.length; i++) { output.append(sums[i]); if (i != sums.length - 1) { output.append(", "); } } output.append(")"); System.out.println(output); } public static void main(String[] args) { int[][] sampleArray = { {3, -1, 4, 0}, {5, 9, -2, 6}, {5, 3, 7, -8} }; int[] results = calculateRowSums(sampleArray); printRowSums(results); } }
核心优化点:
- 通用性:使用方法输入参数进行计算,不再硬编码,支持任意行数的二维数组
- 扩展性:用数组存储每行的和,行数变化时无需修改代码
- null安全:加入输入数组和每行的null校验,避免运行时崩溃
- 单一职责:拆分计算和输出为两个方法,代码更易测试和维护
- 可读性:使用增强for循环和清晰的变量命名,逻辑一目了然
Stream API版(更简洁)
如果你偏好函数式编程风格,用Java Stream可以写出更简洁的代码,同时保留所有安全特性:
import java.util.Arrays; import java.util.Objects; public class ArraySumHandler { public static int[] calculateRowSums(int[][] array) { Objects.requireNonNull(array, "输入的二维数组不能为null"); return Arrays.stream(array) .map(row -> row == null ? 0 : Arrays.stream(row).sum()) .mapToInt(Integer::intValue) .toArray(); } public static void printRowSums(int[] sums) { Objects.requireNonNull(sums, "求和结果数组不能为null"); String output = Arrays.stream(sums) .mapToObj(String::valueOf) .reduce((a, b) -> a + ", " + b) .map(s -> "(" + s + ")") .orElse("()"); System.out.println(output); } public static void main(String[] args) { int[][] sampleArray = { {3, -1, 4, 0}, {5, 9, -2, 6}, {5, 3, 7, -8} }; int[] results = calculateRowSums(sampleArray); printRowSums(results); } }
这个版本用更少的代码实现了相同的功能,同时保持了代码的可读性和安全性。
内容的提问来源于stack exchange,提问作者LtMuffin
相关产品推荐
相关产品推荐

