Java中如何将ArrayList从一个方法传递至另一个方法并填充数据?
问题解决方法
你的问题核心是变量作用域的问题:shapes是start()方法里的局部变量,只能在start()内部访问,create()方法根本看不到它,所以会报“无法识别shapes”的错误。下面给你两种可行的修复方案:
方案一:将shapes作为参数传递给create()
这是最贴合你需求(创建列表后传递引用)的方式,直接把列表的引用传给create()方法:
import java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayList; public class Test { public static void start() { ArrayList<Object> shapes = new ArrayList<>(); // 调用create时传入shapes的引用 create(shapes); } // 修改create方法,添加ArrayList参数 public static void create(ArrayList<Object> shapes) { // IO操作必须处理异常,这里用try-with-resources自动关闭资源 try (BufferedReader file = new BufferedReader(new FileReader("dataFile.txt"))) { // 字符串比较不能用==,要用equals()判断内容 String line = file.readLine(); if ("Rectangle".equals(line)) { String shapeType = file.readLine(); String name = file.readLine(); Double length = Double.valueOf(file.readLine()); Double width = Double.valueOf(file.readLine()); Shape.Rectangle newShape = new Shape.Rectangle(name, length, width); shapes.add(newShape); // 现在可以正常访问shapes了 } } catch (Exception e) { e.printStackTrace(); } } }
方案二:把shapes改成类的静态成员变量
如果你的类里有多个方法需要操作这个列表,可以把它提升为类的静态变量,这样所有静态方法都能直接访问:
import java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayList; public class Test { // 定义为类的静态成员变量,类内所有静态方法可访问 private static ArrayList<Object> shapes; public static void start() { shapes = new ArrayList<>(); create(); } public static void create() { try (BufferedReader file = new BufferedReader(new FileReader("dataFile.txt"))) { String line = file.readLine(); if ("Rectangle".equals(line)) { String shapeType = file.readLine(); String name = file.readLine(); Double length = Double.valueOf(file.readLine()); Double width = Double.valueOf(file.readLine()); Shape.Rectangle newShape = new Shape.Rectangle(name, length, width); shapes.add(newShape); } } catch (Exception e) { e.printStackTrace(); } } }
额外注意事项
- 字符串比较永远不要用
==,==比较的是对象引用地址,要用equals()判断字符串内容; - IO操作必须处理异常,上述代码用了try-with-resources语法,会自动关闭BufferedReader,避免资源泄漏;
- 建议把
ArrayList<Object>改成ArrayList<Shape.Rectangle>或者ArrayList<Shape>(如果存在Shape父类的话),这样类型更安全,避免后续强制转换的问题。
内容的提问来源于stack exchange,提问作者OhmsLaw
相关产品推荐
相关产品推荐

