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

如何在不指定列维度的情况下向Java二维数组输入用户数据?

问题分析与解决方案

报错原因

你创建的是Java的锯齿型二维数组,仅指定了总行数3,但每行的子数组并未初始化,默认值为null。当循环中访问arr[row].length时,试图读取null对象的属性,直接触发NullPointerException。

正确实现方式

根据需求,有两种常见的实现思路:


思路1:先指定每行的元素个数,再输入对应元素

这种方式让用户明确控制每行的列数,适合需要自定义每行长度的场景:

import java.util.Arrays;
import java.util.Scanner;

public class TwoDArray {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[][] arr = new int[3][]; // 初始化3行,每行暂未分配空间

        for (int row = 0; row < arr.length; row++) {
            // 先输入当前行的元素个数,初始化该行数组
            System.out.print("输入第" + (row + 1) + "行的元素数量:");
            int colNum = sc.nextInt();
            arr[row] = new int[colNum];

            // 输入当前行的所有元素
            System.out.print("输入" + colNum + "个整数:");
            for (int col = 0; col < arr[row].length; col++) {
                arr[row][col] = sc.nextInt();
            }
        }

        // 打印结果
        System.out.println("\n最终二维数组:");
        for (int[] rowArr : arr) {
            System.out.println(Arrays.toString(rowArr));
        }
        sc.close();
    }
}

思路2:一次性输入所有元素,自动分配到各行

如果希望用户一次性输入所有数据,程序自动将元素分配到3行(自动处理每行的列数),可以用集合暂存所有元素后再分配:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class TwoDArray {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int totalRows = 3;
        List<Integer> allElements = new ArrayList<>();

        // 读取所有输入的整数,直到输入非整数结束
        System.out.print("输入所有整数(回车结束输入):");
        while (sc.hasNextInt()) {
            allElements.add(sc.nextInt());
        }

        int[][] arr = new int[totalRows][];
        int avgCols = allElements.size() / totalRows;
        int extraElems = allElements.size() % totalRows;

        int elemIndex = 0;
        for (int row = 0; row < totalRows; row++) {
            // 前extraElems行多分配一个元素,保证所有元素都被放入
            int colCount = avgCols + (row < extraElems ? 1 : 0);
            arr[row] = new int[colCount];
            for (int col = 0; col < colCount; col++) {
                arr[row][col] = allElements.get(elemIndex++);
            }
        }

        // 打印结果
        System.out.println("\n最终二维数组:");
        for (int[] rowArr : arr) {
            System.out.println(Arrays.toString(rowArr));
        }
        sc.close();
    }
}

核心注意点

无论哪种方式,必须先为每行的子数组分配内存(即执行arr[row] = new int[列数]),之后才能访问arr[row].length或者给arr[row][col]赋值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 19:37:37