Java Scanner在一个方法初始化正常另一方法为空报错如何解决
问题根因
- 直接触发报错的原因是
ls变量为空,你在异常捕获分支仅打印了错误日志,没有终止后续代码执行,依然调用了空对象的nextLine()方法,触发空指针异常。 - 同类代码第一个方法正常、第二个异常的核心原因是:两个方法读取的文件不同,第一个读取的
triviaQ开头的题库文件存在,Scanner初始化成功;第二个读取的triviaA开头的答案库文件不存在/路径不匹配/文件名大小写不符,导致Scanner初始化失败进入catch分支,ls没有被赋值。
修复步骤
- 首先确认答案文件是否存在
在getAnswer()方法开头添加一行日志打印,确认要读取的文件名是否符合预期:
System.out.println("待读取的答案文件名:"+"triviaA"+fileChoose+".txt");
运行代码后到Eclipse项目的根目录(如果是打包运行则是jar包所在目录)查找对应文件,确保文件存在、文件名和大小写完全匹配。
- 优化代码逻辑避免空指针
你当前两个方法的写法都存在安全隐患:只要文件读取失败就会触发空指针。推荐使用try-with-resources语法优化,自动关闭输入流,同时避免异常后无效代码执行,修改后的getAnswer()参考代码如下:
public String getAnswer() { try(Scanner ls = new Scanner(new FileInputStream("triviaA"+fileChoose+".txt"))) { skipLines(ls, question); return ls.nextLine(); } catch(FileNotFoundException z) { System.out.println("Error 004: 答案文件triviaA"+fileChoose+".txt 读取失败"); // 此处可根据业务需要返回默认值,或者抛出异常终止逻辑 return ""; } }
- 可选同步优化另一个方法
你可以把正常运行的questionPicker()方法也改成同样的try-with-resources写法,规避同样的空指针风险。
内容的提问来源于stack exchange,提问作者HorizonZz
相关产品推荐
相关产品推荐

