调用set方法设置路径后,get方法返回null的问题求助
Java项目中CampusPath.getCampuspath()返回null问题排查
问题描述
在PSugangSincheong类的run方法内,调用Campus类的run方法设置CampusPath路径后,执行path = campusPath.getCampuspath();时返回null。预期该方法能返回已设置的路径,直接设置后立即调用get方法可正常获取,但当前代码逻辑下返回null,调试未定位到原因。
相关代码
PSugangSincheong类
public class PSugangSincheong { public void run(VUserInfo vUserInfo) { Campus campus = new Campus(); College college = new College(); Department department = new Department(); Lecture lecture = new Lecture(); CampusPath campusPath = new CampusPath(); CollegePath collegePath = new CollegePath(); DepartmentPath departmentPath = new DepartmentPath(); try { // System.out.println(vUserInfo.getName() + "welcome.\n"); int input = 0; String path = System.getProperty("user.dir") + "\\data\\root.txt"; Scanner sc = new Scanner(System.in); campus.show(path); input = sc.nextInt(); campus.run(input, path); path = campusPath.getCampuspath(); System.out.println(path); college.show(path); // input = sc.nextInt(); // college.run(input, path); // path = collegePath.getCollegepath(); // department.show(path); // input = sc.nextInt(); // department.run(input, path); // path = departmentPath.getDepartmentpath(); // lecture.show(path); // input = sc.nextInt(); // lecture.run(input, path); } catch (FileNotFoundException e) { e.printStackTrace(); } } }
Campus类
public class Campus { String newPath = ""; CampusPath campusPath = new CampusPath(); ArrayList<String> campusNum = new ArrayList<>(); ArrayList<String> campusName = new ArrayList<>(); ArrayList<String> campus= new ArrayList<>(); public void show(String path) throws FileNotFoundException { Scanner campusFile = new Scanner(new File(path)); System.out.println("input a number."); while(campusFile.hasNext()) { String line = campusFile.nextLine(); System.out.println(line); String[] tokens = line.split(" "); campusNum.add(tokens[0]); campusName.add(tokens[1]); campus.add(tokens[2]); } campusFile.close(); } public void run(int input, String path) { while(true) { if(input <= Integer.parseInt(campusNum.get(campusNum.size()-1)) && input >= Integer.parseInt(campusNum.get(0))) { for(int i = 0; i < campusNum.size(); i++) { if(input == Integer.parseInt(campusNum.get(i))) { System.out.println(campusName.get(i) + "campus\n"); newPath = campus.get(i); path = System.getProperty("user.dir") + "\\data\\"+ newPath +".txt"; campusPath.setCampuspath(path); } } break; }else { System.out.println("wrong number."); } } } }
CampusPath类
public class CampusPath { private String path; public void setCampuspath(String path) { this.path = path; } public String getCampuspath() { return path; } }
问题原因
核心问题是两个CampusPath实例完全独立:
- 在PSugangSincheong类中创建了一个
CampusPath campusPath = new CampusPath();实例 - Campus类内部又自己创建了另一个
CampusPath campusPath = new CampusPath();实例
Campus.run()方法里调用的是自身内部那个CampusPath的setCampuspath()方法,而PSugangSincheong中调用getCampuspath()的是另一个无关的实例,自然返回null。
解决方案
方案1:外部传入CampusPath实例给Campus类
修改Campus类,去掉内部的CampusPath实例,改为通过构造方法传入外部的实例:
public class Campus { String newPath = ""; private CampusPath campusPath; // 通过构造方法传入外部的CampusPath实例 public Campus(CampusPath campusPath) { this.campusPath = campusPath; } // show方法不变 public void show(String path) throws FileNotFoundException { // 原有代码 } // run方法不变,依然使用传入的campusPath实例 public void run(int input, String path) { // 原有代码 } }
在PSugangSincheong类中创建Campus时,传入自己的CampusPath实例:
CampusPath campusPath = new CampusPath(); Campus campus = new Campus(campusPath); // 传入同一个实例
方案2:将CampusPath改为单例类
修改CampusPath,确保全局只有一个实例,所有地方都使用同一个对象:
public class CampusPath { private static CampusPath instance; private String path; // 私有构造方法,禁止外部new private CampusPath() {} // 获取全局唯一实例 public static CampusPath getInstance() { if (instance == null) { instance = new CampusPath(); } return instance; } public void setCampuspath(String path) { this.path = path; } public String getCampuspath() { return path; } }
在PSugangSincheong和Campus类中,都通过getInstance()获取同一个实例:
- PSugangSincheong类:
CampusPath campusPath = CampusPath.getInstance(); - Campus类:
CampusPath campusPath = CampusPath.getInstance();
方案3:让Campus.run()直接返回路径
去掉对CampusPath的依赖,修改Campus的run方法直接返回设置好的路径:
public String run(int input, String path) { while(true) { if(input <= Integer.parseInt(campusNum.get(campusNum.size()-1)) && input >= Integer.parseInt(campusNum.get(0))) { for(int i = 0; i < campusNum.size(); i++) { if(input == Integer.parseInt(campusNum.get(i))) { System.out.println(campusName.get(i) + "campus\n"); newPath = campus.get(i); path = System.getProperty("user.dir") + "\\data\\"+ newPath +".txt"; return path; // 返回设置好的路径 } } break; }else { System.out.println("wrong number."); // 添加输入重新获取逻辑,避免死循环 Scanner sc = new Scanner(System.in); input = sc.nextInt(); } } return null; // 处理无匹配的情况 }
在PSugangSincheong类中直接接收返回值:
path = campus.run(input, path); System.out.println(path);
内容的提问来源于stack exchange,提问作者hmu
相关产品推荐
相关产品推荐

