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

技术问询:非空返回处理及二维数组行求和劣质代码优化

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:56:41