java中的输入不匹配错误

时间:2016-10-27 13:32:35

标签: java arrays file exception text

我正在进行AP CS分配,其中一条指令要求我将文本文件中的每一列数据读入一个独立的一维数组。到目前为止我还没弄清楚,可以使用一些建议/帮助。当我尝试运行程序时,我也得到错误“java.util.InputMismatchException null(在java.util.Scanner中)

1980 Aug    945 100 Allen
1983 Aug    962 100 Alicia
1984 Sep    949 100 Diana
1985 Jul    1002    65  Bob
1985 Aug    987 80  Danny
1985 Sep    959 100 Elena

上面是文本文件,下面是我目前正在使用的代码。

import java.util.Scanner;
import java.io.File;
import java.io.IOException;

public class Hurricanes2
{
    public static void main(String[] args)throws IOException
    {
        //declare and initialize variables

        File fileName = new File("hurcdata2.txt");
        Scanner inFile = new Scanner(fileName);
        int arrayLength = 59;
        int [] year = new int[arrayLength];
        String [] month = new String[arrayLength];
        int [] pressure = new int[arrayLength];
        int [] windSpeed = new int[arrayLength];



        //INPUT  - read data in from the file
        int n = 0;
        while (inFile.hasNext())
        {
            year[n] = inFile.nextInt();
            month[n] = inFile.next();
            pressure[n] = inFile.nextInt();
            windSpeed[n] = inFile.nextInt();
            System.out.println (year[n] + "\n");
            n++;
        }
        inFile.close();

4 个答案:

答案 0 :(得分:1)

你文件的每一行都有5个项目,但你的代码只读取第一行4.所以当它认为它开始下一行时,它实际上是在尝试读取当前行的最后一项,这是 int

一种解决方案是阅读每一行的第五项,即使您没有任何需要存储的地方。

答案 1 :(得分:1)

查看输入数据

1980 Aug    945 100 Allen
1983 Aug    962 100 Alicia
1984 Sep    949 100 Diana

你在抓什么:

        while (inFile.hasNext())
        {
            year[n] = inFile.nextInt();
            month[n] = inFile.next();
            pressure[n] = inFile.nextInt();
            windSpeed[n] = inFile.nextInt();
            System.out.println (year[n] + "\n");
            n++;
        }

输入中有5个字段,你只是抓取4.当它第二次循环时,它希望获取年份(int)而不是抓取名字(字符串)。

答案 2 :(得分:1)

您没有选择while循环中的最后一列。因此,在第二个循环中,扫描程序尝试将第5列作为int读取。 即使您不使用结果,也必须在inFile.next()循环结束时添加while,因此扫描程序不会在下一循环中移位。

答案 3 :(得分:0)

您同时拥有Stringint,因此,要么始终要求String(并稍后将其解析为int),或者,如果您知道您的文件的格式,您可以使用它对您有利。在您的示例中,您有intStringintintString,然后换行。

从这里你可以通过多种方式解决问题。

一个解决方案意味着使用Scanner来读取整行,然后使用String的方法.split(String regex ),我们创建一个字符串数组,我们现在可以解析。但是,要使正确工作的方法,您需要在分隔文本的方式上保持一致。在我的例子中,我使用了tab。我使用了你的例子并将它们全部标记出来。我不会在这里显示,因为编辑器不会保存标签。

File fileName = new File("hurcdata2.txt");

int arrayLength = 6; //I used 6 since you showed 6 lines
//You could use an ArrayList or an algorithm to dynamically 
//increase the size of the arrays.
int [] year = new int[arrayLength];
String [] month = new String[arrayLength];
int [] pressure = new int[arrayLength];
int [] windSpeed = new int[arrayLength];

Scanner fileScanner = null;
try {
    fileScanner = new Scanner( fileName );
}
catch ( FileNotFoundException ex ) {
    //Exception handling;
}


int n = 0;
while( fileScanner.hasNext() ) {
    String toParse = fileScanner.nextLine();
    String[] splitedString = toParse.split( "\t" );

    year[n] = Integer.parseInt( splitedString[0] );
    month[n] = splitedString[1];
    pressure[n] = Integer.parseInt( splitedString[2] );
    windSpeed[n] = Integer.parseInt( splitedString[3] );
    n++;
}
fileScanner.close();

//I will include my test to check it.
for ( int i = 0 ; i < arrayLength; i++ ) {
    System.out.print( "\ni: " + i );
    System.out.print( " - year: " + year[i] );
    System.out.print( "; month: " + month[i] );
    System.out.print( "; pressure: " + pressure[i] );
    System.out.println( "; windSpeed: " + windSpeed[i] );
}

另一种解决方案是使用StringReader代替.split( String regex );StringReader就像Scanner,但它专注于字符串。

您还可以使用FileReader中包含的BufferedReader来读取文件。

FileReader myFileReader = null;
BufferedReader myBufferedReader = null;

try {
    myFileReader = new FileReader( fileName );
    myBufferedReader = new BufferedReader( myFileReader );

    int n = 0;
    String toParse = null;
    while( (toParse = myBufferedReader.readLine()) != null ) {
        //Is this confusing for you? ^
        String[] splitedString = toParse.split( "\t" );

        year[n] = Integer.parseInt( splitedString[0] );
        month[n] = splitedString[1];
        pressure[n] = Integer.parseInt( splitedString[2] );
        windSpeed[n] = Integer.parseInt( splitedString[3] );
        n++;
    }

}
catch ( FileNotFoundException ex ) {
    //Exception handling;
}
catch ( IOException ex ) {
    //Exception handling;
}
finally {
    try {
        myFileReader.close();
    }
    catch ( IOException ex ) {
        //Exception handling;
    }

    try {
        myBufferedReader.close();
    }
    catch ( IOException ex ) {
        //Exception handling;
    }        
}

我希望我有所帮助。

祝你有个愉快的一天。 :)