Java非矩形二维数组输入与索引查找空指针异常问题
问题分析与修复
首先,你遇到的java.lang.NullPointerException是因为未初始化二维数组的子数组,同时代码存在多处逻辑错误,下面逐一说明并修复:
核心错误点解析
- 未初始化子数组导致空指针
你创建了二维数组的第一维int nos[][]=new int[no1][];,但每个nos[i]默认都是null,直接访问nos[i][k]必然触发空指针异常。必须先为每个子数组分配内存空间:
int k=xyz.nextInt(); nos[i] = new int[k]; // 新增该行,初始化当前子数组
- 循环方向错误导致死循环
内层循环for(int j=0;j<k;j--)中,j从0开始递减,永远满足j<k,会陷入无限循环。应改为递增:
for(int j=0;j<k;j++)
- 数组索引越界+赋值错误
nos[i][k]是非法索引——数组下标从0开始,最大有效下标为k-1,应该用nos[i][j]接收输入值:
nos[i][j]=xyz.nextInt();
- 查找结果赋值颠倒
找到目标元素时,应该将当前索引赋值给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
相关产品推荐
相关产品推荐

