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

Java非矩形二维数组输入与索引查找空指针异常问题

问题分析与修复

首先,你遇到的java.lang.NullPointerException是因为未初始化二维数组的子数组,同时代码存在多处逻辑错误,下面逐一说明并修复:

核心错误点解析

  1. 未初始化子数组导致空指针
    你创建了二维数组的第一维int nos[][]=new int[no1][];,但每个nos[i]默认都是null,直接访问nos[i][k]必然触发空指针异常。必须先为每个子数组分配内存空间:
int k=xyz.nextInt();
nos[i] = new int[k]; // 新增该行,初始化当前子数组
  1. 循环方向错误导致死循环
    内层循环for(int j=0;j<k;j--)中,j从0开始递减,永远满足j<k,会陷入无限循环。应改为递增:
for(int j=0;j<k;j++)
  1. 数组索引越界+赋值错误
    nos[i][k]是非法索引——数组下标从0开始,最大有效下标为k-1,应该用nos[i][j]接收输入值:
nos[i][j]=xyz.nextInt();
  1. 查找结果赋值颠倒
    找到目标元素时,应该将当前索引赋值给posi1和posi2,而非反过来:
if(nos[i][j]==l)
{
    posi1 = i;
    posi2 = j;
    break; // 找到后直接退出内层循环,提升效率
}

修复后的完整代码

import java.util.*;

public class IndexSearch // 类名遵循Java大驼峰命名规范
{
    public static void main(String[] args) 
    {
        Scanner xyz=new Scanner(System.in);

        int no1;
        System.out.println("Enter the first dimension of 2D array");
        no1=xyz.nextInt();
        int nos[][]=new int[no1][];

        for(int i =0;i<nos.length ;i++)
        {
            System.out.println("Enter the second dimension corresponding to first index "+i);
            int k=xyz.nextInt();
            nos[i] = new int[k]; // 初始化子数组
            System.out.println("Enter the values into it now");
            for(int j=0;j<k;j++) // 修正循环方向
            {
                nos[i][j]=xyz.nextInt(); // 修正索引
            }
        }
    
        int posi1=-1;int posi2=-1;
        System.out.println("Enter the no you want to search");
        int l=xyz.nextInt();
        for(int i=0;i<nos.length;i++)
        {
            for(int j = 0; j < nos[i].length;j++)
            {
                if(nos[i][j]==l)
                {
                    posi1 = i; // 修正赋值方向
                    posi2 = j;
                    break; // 找到后退出内层循环
                }   
            }
            if(posi1 != -1) break; // 找到后直接退出外层循环
        }
        if(posi1!=-1&&posi2!=-1)
        {
            System.out.println("The index was "+posi1+" "+posi2);
        }
        else
        {
            System.out.println("The no doesn't exist");
        }
        xyz.close(); // 关闭Scanner资源
    }    
}

关于非矩形二维数组的疑问

完全可以实现用户自定义尺寸的非矩形二维数组(又称锯齿数组),Java原生支持这种结构——二维数组的每个子数组长度可以不同。你遇到的问题只是代码逻辑错误,和数组类型无关,只要正确初始化每个子数组,就能正常使用和查找元素。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 23:15:16