You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Scanner在一个方法初始化正常另一方法为空报错如何解决

问题根因
  • 直接触发报错的原因是 ls 变量为空,你在异常捕获分支仅打印了错误日志,没有终止后续代码执行,依然调用了空对象的 nextLine() 方法,触发空指针异常。
  • 同类代码第一个方法正常、第二个异常的核心原因是:两个方法读取的文件不同,第一个读取的triviaQ开头的题库文件存在,Scanner初始化成功;第二个读取的triviaA开头的答案库文件不存在/路径不匹配/文件名大小写不符,导致Scanner初始化失败进入catch分支,ls 没有被赋值。
修复步骤
  1. 首先确认答案文件是否存在
    在getAnswer()方法开头添加一行日志打印,确认要读取的文件名是否符合预期:
System.out.println("待读取的答案文件名:"+"triviaA"+fileChoose+".txt");

运行代码后到Eclipse项目的根目录(如果是打包运行则是jar包所在目录)查找对应文件,确保文件存在、文件名和大小写完全匹配。

  1. 优化代码逻辑避免空指针
    你当前两个方法的写法都存在安全隐患:只要文件读取失败就会触发空指针。推荐使用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 "";
    }
}
  1. 可选同步优化另一个方法
    你可以把正常运行的questionPicker()方法也改成同样的try-with-resources写法,规避同样的空指针风险。

内容的提问来源于stack exchange,提问作者HorizonZz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 17:45:03