当我运行我的代码时,它说有一个InputMismatchException?适用于两个第一个读取行,但hwne我尝试读取int和双行它没有和字符串行实际上没有读取任何变量,它是空的,因为它不打印任何东西在system.out.println(a + b)......任何提示?
import java.util.*;
import java.io.*;
class Uke55{
public static void main(String[]args){
Scanner input=new Scanner(System.in);
try{
PrintWriter utfil=new PrintWriter(new File("minfil55.txt"));
utfil.println('A');
utfil.println("Canis familiaris betyr hund");
utfil.println(15);
utfil.printf("%.2f", 3.1415);
utfil.close();
}catch(Exception e){
e.printStackTrace();
}
try{
Scanner innfil=new Scanner(new File("minfil55.txt"));
char a=innfil.next().charAt(0);
String b=innfil.nextLine();
System.out.println(a +b);
int c=(int)innfil.nextInt();
double d=(double)innfil.nextDouble();
innfil.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
答案 0 :(得分:1)
那是因为当你使用next(),nextInt()和nextDouble()时,它不会转到新行。 只有newLine()将光标移动到下一行。执行此操作:
try{
Scanner innfil=new Scanner(new File("minfil55.txt"));
char a=innfil.nextLine().charAt(0); //first error was here. calling next() only
//read A and not the \r\n at the end of the
//line. Therefore, the line after this one was
//only reading a newline character and the
//nextInt() was trying to read the "Canis" line.
String b=innfil.nextLine();
System.out.println(a +b);
int c=(int)innfil.nextInt();
innfil.nextLine(); //call next line here to move to the next line.
double d=(double)innfil.nextDouble();
innfil.close();
}
catch(Exception e){
e.printStackTrace();
}
next(),nextInt(),nextDouble(),nextLong()等...都在任何空格(包括行尾)之前停止。
答案 1 :(得分:0)
那是因为你有文件:
A\n
Canis familiaris betyr hund\n
15\n
3.14
\n
表示新行字符。
第一次来电时
innfil.nextLine().charAt(0)
它读取A
,扫描仪读数指向第一个\n
然后你打电话
innfil.nextLine()
它会一直读到\n
(nextLine()
读到\n
并将扫描仪读数指针移过\n
),并使读数指针超过\n
。读指针位于下一行的C
。
然后你打电话
innfil.nextInt()
杜!扫描仪无法将Canis
识别为整数,输入不匹配!
答案 2 :(得分:0)
根据 Scanner.nextLine() 的文件,它 “使此扫描程序超过当前行,并返回跳过的输入。”
因此,在调用char a=innfil.next().charAt(0);
之后,“光标”位于第一行的末尾。调用String b=innfil.nextLine();
读取直到当前行的末尾(没有任何内容可读),然后前进到下一行(实际的String所在的位置)。
<强>解决方案强>
在调用String b=innfil.nextLine();
之前,您需要前进到下一行:
...
char a=innfil.next().charAt(0);
innfil.nextLine();
String b=innfil.nextLine();
...
注意强> 的:
虽然 Scanner.nextInt() 和 Scanner.nextDouble() 的行为方式与 Scanner.next() 相同,但您不会面临同样的问题,因为这些方法将读取下一个完整的标记(其中“一个完整的标记前面跟着与分隔符模式相匹配的输入”)和空白字符(例如换行符)被认为是分隔符。因此,如果需要,这些方法将自动前进到下一行,以便找到下一个完整令牌。
答案 3 :(得分:-1)
您是否检查过某些内容实际写入您的文件?我不信。在关闭PrintWriter之前尝试调用flush()。编辑:对不起,我错了,因为我在考虑自动线冲洗。