Java循环获取用户输入报No line found错误,求正确实现方案
解决你的输入错误与程序逻辑问题
嘿,我一眼就看到你代码里的核心问题啦!你遇到的No line found for nextline/int错误,根源是你误用了读取文件的Scanner来获取用户控制台输入,而不是专门读取控制台输入的Scanner。咱们一步步把问题理顺,修正代码:
核心问题分析
- 你创建的
Scanner fileIn = new Scanner(f)是用来读取指定文件内容的,不是读取用户在控制台输入的内容。当文件是空的时候(刚创建的新文件),调用nextLine()自然会找不到内容,抛出错误。 - 每次循环都重复创建文件读取的
Scanner和PrintWriter,不仅浪费资源,还会导致文件内容被反复覆盖,无法保留历史输入。 - 手动关闭资源的方式不够稳妥,容易遗漏关闭操作导致资源泄漏。
修正后的完整代码
import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.util.Scanner; public class ExpenseTracker { public static void main(String[] args) { int saldo = 10000; String anw = "j"; int cost; File f = new File("C:\\Users\\ae65255\\Desktop\\file.txt"); // 用try-with-resources自动管理控制台输入的Scanner,不用手动close try (Scanner userInput = new Scanner(System.in)) { // 先确保文件存在,不用每次循环都创建 if (!f.exists()) { f.createNewFile(); System.out.println("文件已创建"); } while (anw.equalsIgnoreCase("j")) { // 忽略大小写,用户输入J/j都可以 System.out.println("Ange utgiftspost:"); String post = userInput.nextLine(); // 读取控制台输入的字符串 System.out.println("Ange kostnad:"); // 这里可以加个判断,确保输入的是整数,避免输入非数字报错 while (!userInput.hasNextInt()) { System.out.println("请输入有效的整数!"); userInput.nextLine(); // 清空无效输入 } cost = userInput.nextInt(); userInput.nextLine(); // 读取掉换行符,避免影响后续的nextLine() // 更新余额(你原来的saldo = +saldo -cost写法多余,直接saldo -= cost即可) saldo -= cost; System.out.println("saldo: " + saldo); // 将内容追加到文件(用PrintWriter的追加模式,避免覆盖原有内容) try (PrintWriter writer = new PrintWriter(new java.io.FileWriter(f, true))) { String fileContent = "---" + post + "---" + cost + "---" + saldo; writer.println(fileContent); } catch (IOException e) { System.err.println("写入文件时出错: " + e.getMessage()); } System.out.println("Vill du mata in fler uppgifter? (j/n) :"); anw = userInput.nextLine(); } System.out.println("程序结束,最终余额: " + saldo); } catch (IOException e) { System.err.println("文件操作出错: " + e.getMessage()); } System.out.println("File path: " + f.getPath()); } }
关键修改点说明
- 输入来源修正:使用
Scanner userInput = new Scanner(System.in)专门读取控制台的用户输入,这才是获取用户输入的正确方式。 - 文件追加模式:用
FileWriter(f, true)作为PrintWriter的参数,实现文件内容追加,而不是每次覆盖原有内容。 - 自动资源管理:用
try-with-resources语法,自动关闭Scanner和PrintWriter,避免资源泄漏。 - 输入合法性校验:增加了整数输入的校验,防止用户输入非数字导致程序崩溃。
- 简化余额计算:把冗余的
saldo = +saldo -cost改成更简洁的saldo -= cost。
这样修改后,程序就能正常读取用户的字符串和整数输入,同时正确保存记录到文件里啦!
内容的提问来源于stack exchange,提问作者CoderX9
相关产品推荐
相关产品推荐

