Java调用InterfaceController的fileList方法传值后始终返回0或null
问题根因
你遇到的返回0/Null的核心原因是InterfaceController实例隔离:
你在Encryptor.encrypt()方法中通过new InterfaceController()创建的是局部临时实例,调用ic.fileList()修改的仅为该临时对象的属性值,和你主程序中用来读取打印的InterfaceController实例是两个完全独立的对象,属性互不共享,因此读取到的始终是初始值。如果将fileListMain改为引用类型Integer且未赋初始值,默认值就是null,符合你描述的现象。
解决方案
方案1:单例模式改造InterfaceController(推荐)
保证全程序只有一个InterfaceController实例,所有地方修改/读取的都是同一个对象的属性:
public class InterfaceController { // 全局唯一实例,类加载时初始化 private static final InterfaceController INSTANCE = new InterfaceController(); private int fileListMain = 0; // 私有构造方法,禁止外部随意创建实例 private InterfaceController() {} // 对外提供获取唯一实例的静态方法 public static InterfaceController getInstance() { return INSTANCE; } public void fileList(int list) { fileListMain = list; // 可选:取消注释即可直接更新通知文本 //_notif.setText(fileListMain + " files are encrypted successfully!"); } // 提供属性读取方法 public int getFileListMain() { return fileListMain; } }
修改Encryptor类中的调用逻辑,不要新建实例,直接取全局单例:
// 删掉原来的InterfaceController ic = new InterfaceController(); InterfaceController ic = InterfaceController.getInstance(); ic.fileList(files.length);
主程序中读取数值时也通过单例获取:
int count = InterfaceController.getInstance().getFileListMain(); System.out.println(count);
方案2:实例参数传递
如果不需要全局唯一控制,可将主程序中正在使用的InterfaceController实例作为参数传入encrypt方法,避免新建实例:
首先修改encrypt方法签名:
// 新增InterfaceController类型的入参 public void encrypt(File src, File dst, InterfaceController ic) throws IOException
方法内直接使用传入的ic实例调用方法即可,不要新建实例:
// 删掉原来的InterfaceController ic = new InterfaceController(); ic.fileList(files.length);
主程序调用encrypt方法时传入自己持有的InterfaceController实例即可。
其他注意事项
- 你贴出的InterfaceController代码中
private int fileListMain = 0末尾缺少分号,会导致编译报错,请补上。 src.listFiles()可能返回null:当源路径不是目录、或者程序没有源目录的读取权限时,listFiles返回null,直接调用files.length会触发空指针异常,建议增加判空逻辑:
File[] files = src.listFiles(); if (files == null) { System.out.println("无法读取源目录内容,请检查路径和权限"); return; }
内容的提问来源于stack exchange,提问作者Scabbard Gaming
相关产品推荐
相关产品推荐

