Java Scanner类读取一行,然后停止
我对使用Scanner类的方法有这个问题。我用扫描器读取文本文件,然后将int解析成数组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;
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()){…}
。