帕斯卡三角代码变量声明顺序调整后消除未初始化错误的原因
帕斯卡三角代码编译错误原因解析
在实现帕斯卡三角生成功能时,编写的Java代码触发了编译错误,但调整变量声明顺序后即可正常运行,具体情况如下:
错误代码示例
class Solution { public List<List<Integer>> generate(int numRows) { List<List<Integer>> rows = new ArrayList<List<Integer>>(); List<Integer> pre, row = null; for(int i=0; i<numRows; ++i){ row = new ArrayList<Integer>(); for(int j=0; j<=i; ++j){ if(j==0 || j==i) row.add(1); else row.add(pre.get(j-1)+pre.get(j)); } pre=row; rows.add(row); } return rows; } }
编译错误信息
Line 12: error: variable pre might not have been initialized row.add(pre.get(j-1)+pre.get(j)); ^
修复后的变量声明
将第四行的变量声明改为:
List<Integer> row, pre = null;
原因解析
这是Java严格的局部变量初始化规则导致的:
- Java要求局部变量必须显式初始化后才能被使用,编译器仅做静态语法检查,不会分析代码的执行逻辑流程。
- 原代码中
List<Integer> pre, row = null;的写法,只有row被赋值为null完成初始化,pre仅被声明,没有任何初始化操作。 - 当
i>=1(生成第二行及以后的行)时,代码会进入else分支调用pre.get(...),编译器无法保证pre此时已经被赋值,因此抛出编译错误。 - 修复后的
List<Integer> row, pre = null;,给pre显式赋值了null,满足“已初始化”的要求,编译器不再报错。从逻辑上看,当numRows>=2时,pre在进入else分支前已经被第一次循环的pre=row赋值为有效List对象,不会触发空指针异常。
内容的提问来源于stack exchange,提问作者Sachin K Rao
相关产品推荐
相关产品推荐

