Java运行代码提示name、age等cannot be resolved to a variable如何解决
报错原因
这个cannot be resolved to a variable报错的核心原因是Java变量作用域限制:
你把name、age、country三个数组定义在了try代码块内部的while((str = in.readLine())!= null)循环体里,这类在大括号{}包裹的代码块内部声明的局部变量,仅在当前代码块内有效,出了这个范围就会被销毁,外部代码无法访问。你后续的打印逻辑写在了try代码块外面,自然找不到这三个变量。
解决方案
1. 核心调整:把变量声明移到作用域外层
将三个数组的声明放到main方法最开头,和int n = 0同级别,保证后续所有代码都能访问到,同时修正原代码隐藏的逻辑问题,调整后的完整代码如下:
import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class AnyInteger { public static void main(String arg[]) throws FileNotFoundException { int n = 0; // 数组声明移到外层,提前定义 String name[] = null; int age[] = null; String country[] = null; try { BufferedReader in = new BufferedReader(new FileReader("D:\\Java\\eclipse-workspace\\AnyInteger\\src\\file.txt")); String str; while ((str = in.readLine())!= null) { String[] arr =str.split("#"); // 每3个字段对应一组数据,数组长度为总字段数/3 n = arr.length / 3; // 直接给外层数组赋值 name = new String[n]; age = new int[n]; country = new String[n]; int i = 0; int j = 0; while(i < arr.length) { name[j] = arr[i]; i++; age[j] = Integer.parseInt(arr[i]); i++; country[j] = arr[i]; i++; j++; } } in.close(); } catch (IOException e) { System.out.println("File Read Error"); } // 增加非空判断,避免文件读取失败时空指针异常 if(name != null && age != null && country != null) { System.out.println("Names: "); for(int i=0;i<n;i++) { System.out.print(name[i]+" "); } System.out.println("\nAges: "); for(int i=0;i<n;i++) { System.out.print(age[i]+" "); } System.out.println("\nCountries: "); for(int i=0;i<n;i++) { System.out.print(country[i]+" "); } } } }
2. 其他隐藏问题说明
原代码还存在两个容易触发异常的逻辑问题:
- 数组长度设置错误:
arr是按#拆分后的所有字段,每3个字段对应1组数据,所以数组长度应该是arr.length/3而不是arr.length,否则会触发数组越界异常 - 嵌套循环逻辑冗余:原内层
for(int j=0;j<3;j++)的逻辑会导致i累加超出数组范围,直接用单循环遍历赋值即可 - 如果你的
file.txt有多行数据,当前逻辑会用最后一行的内容覆盖前面的所有数据,如需存储所有行的内容,建议用ArrayList等动态集合替代固定长度数组。
内容的提问来源于stack exchange,提问作者Abc
相关产品推荐
相关产品推荐

