Java Scanner类读取一行,然后停止

Java Scanner类读取一行,然后停止,java,Java,我对使用Scanner类的方法有这个问题。我用扫描器读取文本文件,然后将int解析成数组 public static void readItems() { try { File file = new File(System.getProperty("user.home") + "./SsGame/item.dat"); Scanner scanner = new Scanner(file); int line = 0;

我对使用Scanner类的方法有这个问题。我用扫描器读取文本文件,然后将int解析成数组

public static void readItems() 
{
    try 
    {
        File file = new File(System.getProperty("user.home") + "./SsGame/item.dat");
        Scanner scanner = new Scanner(file);
        int line = 0;
        while (scanner.hasNextLine())
        {
            String text = scanner.nextLine();
            text = text.replaceAll("\\W", "");
            System.out.println(text.trim());
            PlayerInstance.playerItems[line] = Integer.parseInt(text);
            line++;
        }
        scanner.close();
    } catch (FileNotFoundException e) 
    {
        e.printStackTrace();
    } catch (NumberFormatException e2)
    {
        e2.printStackTrace();
    }
}
下面是item.txt文件:

1
1
2
3
4
我运行代码并获得以下输出:

1
我尝试过使用scanner.hasNextInt()和scaner.nextInt();但它不会打印任何东西

如果我删除parseInt部分,那么文件将完成读取,所有数字都将打印出来。有什么想法吗

这是引发的异常:

java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at game.player.ReadPlayer.readItems(ReadPlayer.java:56)
at game.player.ReadPlayer.read(ReadPlayer.java:11)
at game.Frame.<init>(Frame.java:32)
at game.Frame.main(Frame.java:54)
java.lang.NumberFormatException:用于输入字符串:“
位于java.lang.NumberFormatException.forInputString(未知源)
位于java.lang.Integer.parseInt(未知源)
位于java.lang.Integer.parseInt(未知源)
在game.player.ReadPlayer.readItems(ReadPlayer.java:56)
在game.player.ReadPlayer.read(ReadPlayer.java:11)
在game.Frame.(Frame.java:32)
在game.Frame.main(Frame.java:54)

我猜
Integer.ParseInt()
正在抛出一个
NumberFormatException
,因为您的行仍然包含
\n

如果改为调用
Integer.ParseInt(text.trim())
,它可能会修复它


如果您正确处理了
异常
,我们会有一个更好的主意。

这是因为,在解析整数时,您有一个NumberFormatException

外接程序catch部分类似这样的内容

System.out.println(e.getCause());

请看,您有一个例外,这就是为什么此代码只打印第一个数字。

使用扫描仪时需要小心

如果您正在读取更多数据,请使用类似于
input.nextInt()的Scaner
然后它将只读取一个int。回车不被
nextInt
消耗。一种解决方案是添加
input.nextLine()以便移动到下一行

另一个解决方案是,我更喜欢使用BufferedReader

    BufferedReader bufferRead = new BufferedReader(new InputStreamReader(System.in));
    String tempStr = bufferRead.readLine();

    // Do some operation on tempStr

希望这有帮助。

永远不要有空的挡块。它弊大于利。您正在吞咽异常-您可能会从NumberFormatException中获得异常捕获时打印异常,以查看它们是否被抛出。如果您的文本文件的数据为“1”,则它也将进入解析异常,因为它将无法转换为整数。在catch块中打印堆栈跟踪这就是我使用replaceAll(\\W,“”)的原因@Mena他们应该处理正确捕获的所有异常,而不仅仅是抛出的异常@Robadob为true,但在本例中,有问题的
catch
语句是
NumberFormatException
。我的编辑旨在缩小OP的范围。@Mena True,但你应该更改第一个异常,而不是第二个,我现在就这么做。感谢它的工作,增加了一个检查,看看是否线是空的。if(text.equalsIgnoreCase(“”){continue;}@lucasfrayburchard不要只使用
if(text.isEmpty()){…}