Java Can';t从循环中的.txt文件创建数组

Java Can';t从循环中的.txt文件创建数组,java,arrays,file-io,nested-loops,Java,Arrays,File Io,Nested Loops,我正试图从.txt创建不同类型的数组(字符串、int…),但我立即面临一条错误消息 Exception in thread "main" java.util.InputMismatchException at java.util.Scanner.throwFor(Scanner.java:864) at java.util.Scanner.next(Scanner.java:1485) at java.util.Scanner.nextInt(Scanner.java:

我正试图从.txt创建不同类型的数组(字符串、int…),但我立即面临一条错误消息

 Exception in thread "main" java.util.InputMismatchException
    at java.util.Scanner.throwFor(Scanner.java:864)
    at java.util.Scanner.next(Scanner.java:1485)
    at java.util.Scanner.nextInt(Scanner.java:2117)
    at java.util.Scanner.nextInt(Scanner.java:2076)
    at javaapplication12.JavaApplication12.main(JavaApplication12.java:27)
Java Result: 1 
这是我的密码:

PackageJavaApplication12;
导入java.io.File;
导入java.io.FileNotFoundException;
导入java.util.Scanner;
公共类JavaApplication12{
公共静态int num=128;
公共静态字符串[]名称=新字符串[num];
公共静态int[]id=新int[num];
公共静态整数[]年=新整数[num];
公共静态双精度[]价格=新双精度[num];
公共静态int[]sh=新int[num];
公共静态int[]行=新int[num];
公共静态int[]列=新int[num];
公共静态void main(字符串[]args)引发FileNotFoundException{
File inputFile=新文件(“Store.txt”);
扫描仪fin=新扫描仪(输入文件);
fin.nextLine();
fin.nextLine();
while(fin.hasNext()){
for(int i=0;i}
您可以使用BufferReader逐行读取,您的名字有问题,有时您的名字有一个字符串,有时有两个,因此您会得到
java.util.InputMismatchException
,因为您尝试在
id[i]=fin.nextInt()中读取int但这不是一个int,如果您得到此错误,这可以帮助您:

public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException, IOException {
    File filePath = new File("Store.txt");
    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "Cp1252"));

    String line;
    String lineSplit[];
    int i = 0;
    while ((line = br.readLine()) != null) {
        //replace multiple spapce with one space
        line = line.replaceAll("\\s{2,}", " ").trim();
        //Split the line with space so you can get an Array :
        //like this [Saw, 562, SAT, SEP, 30, 00:00:00, AST, 1950, 37.00, 2, 13, 1]
        //or this   [Tape, Measure, 955, TUE, AUG, 27, 00:00:00, AST, 1918, 52.00, 13, 4, 4]
        lineSplit = line.split(" ");
        System.out.println(Arrays.toString(lineSplit));
        //if we notice the Name can contain one String or two so we can check get names like this :
        boolean check = false;
        try {
            Integer.parseInt(lineSplit[1]);
            check = true;
        } catch (NumberFormatException e) {
            check = false;
        }
        if (check) {
            name[i] = lineSplit[0];
            id[i] = Integer.parseInt(lineSplit[1]);
            year[i] = Integer.parseInt(lineSplit[7]);
            price[i] = Double.parseDouble(lineSplit[8]);
            sh[i] = Integer.parseInt(lineSplit[9]);
            row[i] = Integer.parseInt(lineSplit[10]);
            col[i] = Integer.parseInt(lineSplit[11]);
        } else {
            name[i] = lineSplit[0] + " " + lineSplit[1];
            id[i] = Integer.parseInt(lineSplit[2]);
            year[i] = Integer.parseInt(lineSplit[8]);
            price[i] = Double.parseDouble(lineSplit[9]);
            sh[i] = Integer.parseInt(lineSplit[10]);
            row[i] = Integer.parseInt(lineSplit[11]);
            col[i] = Integer.parseInt(lineSplit[12]);
        }
        i++;
    }
    br.close();
}

我花了一段时间才理解代码,但我终于明白了

因此,变量
num
必须是文件中的总行数,并且您正试图为每个字段构建一个
数组。如果我错了,不要继续读下去

如果我是对的,那么您的错误来自于使用
nextLine()
,并认为它将跳转到文件下一行的下一个相同列值

当您使用
nextLine()
时,实际上是跳转到txt文件的下一行,在您的特定情况下,该行将以Name列开始,因此现在就为第一行的id引入int值,实际上,您正在尝试从第二行为其指定Name列的值

因此,最好的方法是提取每行的所有值,然后尝试拆分它们,希望您有一个逗号分隔的文件,或者您可以从检索数据的表中生成一个

因此,您将从文件中获得一个字符串数组,如下所示:

String[]arrayFromTheFile = new String[128];
    int i=0;
    File inputFile = new File("Store.txt");
    Scanner fin = new Scanner(inputFile);
    while (fin.hasNext()) {
    arrayFromTheFile[i] = fin.next();
    i++;
}
fin.close();
所以现在,只要你确定文件有128行,你就已经构建了你的数组,如果没有的话,你会得到一个
ArrayOutOfBoundsException
,这是一个全新的体验:)事实上最好的方法是通过友好的方式,但是正如你所说的,你是一个新手,让我们按照他们教你的方式来做吧


对于字段拆分,为了填充其他数组,需要使用
split()
方法,并使用字段之间的任意字符。我会留给你去调查;)

欢迎来到StackOverflow!请记住,Java!=Javascript,它们和汽车和地毯差不多。@Henrykvdb哦,谢谢你提供的信息!我想我把它搞错了。你的文本文件的内容是什么?最好的猜测是名称是两个单词(如“John Smith”),并且
next()
只取“John”,然后
nextInt()
正试图解析“Smith”,而这显然不是一个int,因此它抛出了一个异常。但是如果没有文本文件,就不可能确定了。@YCF_我刚刚说了。