如何在不指定列维度的情况下向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
相关产品推荐
相关产品推荐

