Java 如何获取Scanner.nextInt()以获取下一个int?
好吧,我以前从来没有遇到过这个问题,我觉得很奇怪。我正在尝试从该患者分类程序的文件中读取输入。对这些方法的前三个调用是有效的,但是当我调用fileRead.nextInt()时,它会崩溃,并给我一个InputMismatchException。我正在读的行有点像这样:我很确定我使用的分隔符是正确的。如果我删除对char的强制转换并尝试将其作为int来执行,这并不重要,它只是不起作用。为什么?我已经完成了一个与此类似的程序,并且fileRead.next()三次(以使三个令牌在线)工作得非常好Java 如何获取Scanner.nextInt()以获取下一个int?,java,file-io,Java,File Io,好吧,我以前从来没有遇到过这个问题,我觉得很奇怪。我正在尝试从该患者分类程序的文件中读取输入。对这些方法的前三个调用是有效的,但是当我调用fileRead.nextInt()时,它会崩溃,并给我一个InputMismatchException。我正在读的行有点像这样:我很确定我使用的分隔符是正确的。如果我删除对char的强制转换并尝试将其作为int来执行,这并不重要,它只是不起作用。为什么?我已经完成了一个与此类似的程序,并且fileRead.next()三次(以使三个令牌在线)工作得非常好 v
void loadPatientData() throws FileNotFoundException
{
linkHeads();
Patient person = null;
Scanner fileRead = makeAFile(patient);
fileRead.useDelimiter(";|\n");
while (fileRead.hasNext())
{
//person = new Patient(fileRead.next(), fileRead.nextBoolean(), fileRead.nextBoolean(), (char)fileRead.nextInt());
String name = fileRead.next();
boolean bob = fileRead.nextBoolean();
boolean joe = fileRead.nextBoolean();
int queue = fileRead.nextInt(); //hell breaks loose
//addPatientData(person);
}
}
鉴于您在windows上,并且文本文件在notepad.exe中正确显示,我将假设您的文件实际上使用了
\r\n
作为换行符,而不仅仅是\n
,这将解释nextInt()
中的异常
例如:
static void loadPatientData() {
Scanner fileRead = new Scanner("John Doe;true;true;0\r\nJane Roe;false;true;2\r\n");
fileRead.useDelimiter(";|\r\n"); // vs.:
// fileRead.useDelimiter(";|\n");
while (fileRead.hasNext()) {
String name = fileRead.next();
boolean bob = fileRead.nextBoolean();
boolean joe = fileRead.nextBoolean();
int queue = fileRead.nextInt(); //hell breaks loose
}
}
要覆盖所有的换行符,您可能只想使用
“;\r\n | \n”
作为分隔符。看到您在windows上,并且文本文件在notepad.exe中正确显示,我将假设您的文件实际上使用\r\n
作为换行符,而不仅仅是\n
,这将解释nextInt()
处的异常
例如:
static void loadPatientData() {
Scanner fileRead = new Scanner("John Doe;true;true;0\r\nJane Roe;false;true;2\r\n");
fileRead.useDelimiter(";|\r\n"); // vs.:
// fileRead.useDelimiter(";|\n");
while (fileRead.hasNext()) {
String name = fileRead.next();
boolean bob = fileRead.nextBoolean();
boolean joe = fileRead.nextBoolean();
int queue = fileRead.nextInt(); //hell breaks loose
}
}
要涵盖所有的换行符情况,您可能只想使用
“|”\r\n |\n”
作为分隔符。为什么不使用fileRead.next()将所有值作为字符串读取,然后将其转换为所需的格式?至少出于诊断目的,请尝试@Bfcm的建议,看看它是否仍然引发异常。使用hasNextInt()用于在调用nextInt()之前检查下一个标记是否为int。为什么不使用fileRead.next()将所有值作为字符串读取,然后将其转换为所需格式?至少出于诊断目的,请尝试@Bfcm的建议,看看它是否仍然引发异常。使用hasNextInt()用于在调用nextInt()之前检查下一个标记是否为int。但这并不能解释为什么它适用于前三行(在\n
中的两行中没有发生意外)。@edwga我相信“对这些方法的前三个调用”是指next[Boolean]()
调用nextInt()之前的三个调用
,成功检索第一行的前3个令牌,而不是指前3行。毕竟,loadPatientData()
方法应该只调用一次。是的,在我的另一个程序中,只需使用fileRead.useDelimiter(;|\n”);工作得非常好。也许是因为调用了next()以外的其他函数,尽管我不确定。但是谢谢你,这完美地修复了错误。但这并不能解释为什么它适用于前三行(它毫无意外地通过了\n
中的两行)。@edwga我相信“对这些方法的前三次调用”指的是next[Boolean]()
之前的三次调用,成功检索第一行的前3个令牌,不引用前3行。毕竟,loadPatientData()
方法应该只调用一次。是的,在我的另一个程序中,只需使用fileRead.useDelimiter(;|\n”);工作得非常好。也许是因为调用了next()以外的其他函数,尽管我不确定。但是谢谢你,这完美地修复了错误。