0

当我运行我的代码时,它说有一个 InputMismatchException?适用于前两个读取行,但是我尝试读取它没有读取的 int 和双行,并且 string-line 实际上没有将任何内容读入变量,它是空的,因为它不打印任何内容在 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();
    }
    }
}
4

4 回答 4

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() 等...都在任何空格(包括行尾)之前停止。

于 2013-10-16T07:30:57.053 回答
0

那是因为你有文件:

A\n
Canis familiaris betyr hund\n
15\n
3.14

where\n代表换行符。

当你第一次打电话时

innfil.nextLine().charAt(0)

它读取A,扫描仪读取指向第一个\n

然后你打电话

innfil.nextLine()

它读取到\nnextLine()读取到\n并将扫描仪读取指针放在过去\n),并使读取指针过去\n。读取指针将C在下一行。

然后你打电话

innfil.nextInt()

呃!扫描仪无法识别Canis为整数,输入不匹配!

于 2013-10-16T07:42:32.617 回答
0

根据Scanner.nextLine()上的文档,它
将此扫描仪前进到当前行并返回被跳过的输入。

所以,调用后char a=innfil.next().charAt(0);的“光标”是在第一行的末尾。调用String b=innfil.nextLine();读取直到当前行的末尾(没有任何内容可读取)并前进到下一行(实际的字符串所在的位置)。

解决方案
您需要在调用之前前进到下一行String b=innfil.nextLine();

...
char a=innfil.next().charAt(0);
innfil.nextLine();
String b=innfil.nextLine();
...

注意
虽然Scanner.nextInt()Scanner.nextDouble()的行为方式与Scanner.next()相同,但您不会遇到相同的问题,因为这些方法将读取下一个完整的令牌(其中“一个完整的令牌是前面和后面的输入匹配分隔符模式") 和空白字符(例如换行符)被视为分隔符。因此,如果需要,这些方法将自动前进到下一行,以便找到下一个完整的 token

于 2013-10-16T07:43:02.963 回答
-1

您是否检查过某些内容实际上已写入您的文件?我不信。在关闭 PrintWriter 之前尝试调用 flush()。编辑:对不起,我在这里错了,因为我在考虑自动线冲洗。

于 2013-10-16T07:34:21.627 回答