Java Can';t从循环中的.txt文件创建数组
我正试图从.txt创建不同类型的数组(字符串、int…),但我立即面临一条错误消息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:
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_我刚刚说了。