Java Scanner读取文本文件返回null,无法生成随机短语求助
搞定Scanner读不到Phrases.txt的问题
嘿,你的代码思路没问题,但Scanner拿不到文件大概率是路径没搞对,或者文件放错地方了。我给你拆解几个排查方向和修复方案:
1. 先确认文件位置是否正确
你用new File("Phrases.txt")的时候,JVM是在程序运行的当前工作目录找文件,不是你放源代码的文件夹哦!
- 如果你用IDE(比如IntelliJ、Eclipse)跑代码:
- 直接把
Phrases.txt扔到项目根目录(和src文件夹平级的位置),别塞src里。 - 要是实在搞不清,就打印当前工作目录看看:
把文件放到输出的这个路径里绝对能找到。System.out.println("JVM当前找文件的目录:" + System.getProperty("user.dir"));
- 直接把
2. 换更可靠的资源读取方式
如果这个文件是项目的资源文件,推荐用ClassLoader读取,不管是IDE跑还是打成jar包都不会出问题:
public static String phrasePicker() throws IOException { // 用类加载器获取资源输入流 InputStream inputStream = YourClassName.class.getClassLoader().getResourceAsStream("Phrases.txt"); if (inputStream == null) { throw new FileNotFoundException("糟了,找不到Phrases.txt文件!检查下文件位置对不对"); } Scanner input = new Scanner(inputStream); // 用List代替固定长度数组,不用硬写140,更灵活 List<String> phrasesList = new ArrayList<>(); while (input.hasNextLine()) { phrasesList.add(input.nextLine()); } input.close(); // 加个判断,避免空文件导致的报错 if (phrasesList.isEmpty()) { throw new IllegalStateException("Phrases.txt里啥都没有啊,先加点短语进去吧"); } Random random = new Random(); int select = random.nextInt(phrasesList.size()); return phrasesList.get(select); }
记得把YourClassName换成你实际的类名哈。
3. 原代码里的小bug要改
你写的i = i++;是无效的!后置自增i++会先返回i原来的值,再自增,然后你又把原来的值赋值回i,等于i根本没涨。直接改成i++或者i += 1就行。
4. 额外提醒:处理异常和关闭资源
原代码里Scanner没关闭,虽然JVM会自动回收,但最好显式调用input.close(),或者用try-with-resources语法自动关闭资源:
try (Scanner input = new Scanner(new File("Phrases.txt"))) { // 你的读取逻辑 }
这样改完应该就能正常读取文件,随机返回短语啦!
内容的提问来源于stack exchange,提问作者Kavin Zhu
相关产品推荐
相关产品推荐

