Java尝试读取文本文件时遇到运行时错误
我目前正在尝试编写一个应该按顺序排列的Java任务;
但是,我反复遇到一个运行时问题,我收到此错误消息;
在Lab2.main上的线程“main”java.util.NoSuchElementException在java.util.Scanner.throwFor(Scanner.java:862)在java.util.Scanner.next(Scanner.java:1371)上的异常(Lab2.java: 27)
这导致我相信我可能读错了文本文件。 但是,无论我做什么,我都无法使其正确读取。 它应该读取一个名字,一个姓氏,一个地址(它连接成一个字符串),一个城市,一个州,一个邮政编码(作为一个整数),一个电话号码(作为一个字符串)和一美元的金额(作为一个双)。
我相信这个问题可能来自城市名称,因为他们中的一些人之间有空间。 我认为我已经通过设置扫描器的分隔符来解决这个问题,该扫描器将每个单独的字符串读取到一个标签(这是每个其他元素被分隔的东西),但是这没有工作(并且因此试图将状态名称变成一个整数通过Integer.parseInt()静态方法),或者不是问题。 正如我所说,我没有想法,并会非常感谢任何能够帮助我的人!
我将列出下面的代码。 首先是主文件;
public class Lab2
{
public static void main(String[] args) throws IOException
{ String FirstName, LastName, Address1, Address2, Address3, AddressFull, City, State, Phone, ZipString, DonString, line = "blank";
int Zip;
double Donation;
Scanner fileScan = new Scanner(new File("Lab2.txt")), lineScan = new Scanner(line);
lineScan.useDelimiter("t");
PersonStats[] Donators = new PersonStats[25];
for (int i = 0; i < Donators.length; i++)
{ line = fileScan.nextLine();
FirstName = lineScan.next();
LastName = lineScan.next();
Address1 = lineScan.next();
Address2 = lineScan.next();
Address3 = lineScan.next();
AddressFull = Address1 + " " + Address2 + " " + Address3;
City = lineScan.next();
State = lineScan.next();
ZipString = lineScan.next();
Zip = Integer.parseInt(ZipString);
Phone = lineScan.next();
DonString = lineScan.next();
Donation = Double.parseDouble(DonString);
Donators[i] = new PersonStats(FirstName, LastName, AddressFull, City, State, Zip, Phone, Donation);
Donators[i].PrintOut();
}
}
}
接下来,我为这个任务写下了类文件;
public class PersonStats
{ private String FirstName, LastName, Address, City, State, Phone;
private int Zip;
private double Donation;
public PersonStats(String first, String last, String area, String town, String feifdom, int postcode, String telegraph, double given)
{ FirstName = first;
LastName = last;
Address = area;
City = town;
State = feifdom;
Zip = postcode;
Phone = telegraph;
Donation = given;
}
public void PrintOut()
{ System.out.println(FirstName + " " + LastName);
System.out.println(Address);
System.out.println(City + ", " + State + " " + Zip + "n");
System.out.println(Phone + " " + Donation);
}
}
最后,程序应该读取的文本文件(可能有点难以阅读,只记得除了城市名称中的每个空间实际上是一个选项卡);
Rick James 8276 Carlos Ave Las Vegas NV 87126 5553451567 23.95
John Gibson 9127 Oak Dr Corvallis OR 97330 5552812313 156.78
Ron Wills 1155 Ivy Pl Atlantic Ga 37339 5552123145 189.56
Rita Jones 1259 Chase Ave Las Vegas NV 87126 5554445671 2145.60
Jason Knight 7154 Pine Dr Gresjam OR 97380 5558124545 3157.44
Clara Swanson 1944 Main Pl Springfield OR 97339 5552123144 212.99
Robert Peck 1866 First Ave Las Vegas NV 87126 5553455425 250.00
Dora Garcia 2179 Fir Dr Corvallis OR 97330 5552812919 350.00
Peter Keck 1465 Circle Pl Gold Beach OR 97339 5552123256 2150.00
Stuart Smith 2387 Sweek Ave Las Vegas NV 87126 5553455489 650.99
Tyler Wild 1313 Spooky Ln Corvallis OR 97330 5552813213 587.45
Laretta Peters 2224 Chase Pl Monmouth OR 97361 5552124465 123.45
Kristi Emry 3465 Cerrito Ave Las Vegas NV 87126 5553455567 3212.65
Kelli Gard 1894 Elm Dr Corvallis OR 97330 5552816678 51.00
Jacob Andrews 8159 Rose Ct Mill City OR 97322 5552127879 64.00
Ryan Perkins 7546 Prince Ave Las Vegas NV 87126 5553451989 13.00
Joshua Gilbert 9278 Monroe Dr Corvallis OR 97330 5552832656 95.00
Miles Crain 4578 Chester Dr Corvallis OR 97331 5552345678 1544.00
Butch Cassidy 5498 Sutton Pl Gresham OR 97380 5416565797 1798.56
Perry Winkle 8185 Shaver Ave Las Vegas NV 87126 5553812346 195.66
Loni Day 4598 Holmen Dr Corvallis OR 97330 5555289741 1878.50
Nikita Benson 1787 Grant Pl Portland OR 97321 5553569898 1500.00
Rusty Krouger 8829 Simeon Ave Las Vegas NV 87126 5555677847 2100.00
Wally Wallace 2898 Wilson Blvd Jackson Center OH 23466 5552222222 2222.22
Joe Jones 1212 Water St Millersburg OR 97366 5555555555 55.55
再次感谢,如果有人能帮助我,那么你的建议可能会挽救生命......或者至少是这个实验室的得分:S
好的,在这里
import java.io.IOException;
import java.io.*;
import java.util.Scanner;
public class Lab2
{
public static void main(String[] args) throws IOException
{ String FirstName, LastName, Address1, Address2, Address3, AddressFull, City, State, Phone, ZipString, DonString, line = "blank";
int Zip;
double Donation;
Scanner fileScan = new Scanner(new File("F:/test.txt")).useDelimiter("n");
PersonStats[] Donators = new PersonStats[5];
String tempVal="";
int i = 0;
while(fileScan.hasNext())
{
tempVal = fileScan.next(); //Storing person records one at a time in the string line by line
String tempArr[] = tempVal.split("t"); //Splitting each person record string by tab and storing it in a String array
FirstName = tempArr[0];
LastName = tempArr[1];
Address1 = tempArr[2];
Address2 = tempArr[3];
Address3 = tempArr[4];
AddressFull = Address1 + " " + Address2 + " " + Address3;
City = tempArr[5];
State = tempArr[6];
ZipString = tempArr[7];
Zip = Integer.parseInt(ZipString);
Phone = tempArr[8];
DonString = tempArr[9];
Donation = Double.parseDouble(DonString);
Donators[i] = new PersonStats(FirstName, LastName, AddressFull, City, State, Zip, Phone, Donation);
Donators[i].PrintOut();
i++;
}
}
}
首先,我想指出你的变量名应该以小写开头。 我没有在代码中编辑它们,因为它们在很多地方都被使用过。 习惯于声明String firstName
而不是String FirstName
在代码中,在你的代码中,你使用了一个"t"
分隔符,我用"n"
代替了这个分隔符,因为在文本文件中每行都保存着整个Person的详细信息。 如果第一个人的捐赠和第二个人的名字被相同分开,那么您可以使用"t"
,但它们之间用“ n”分隔。
因此,现在Scanner fileScan
将Scanner fileScan
读取文件,我将以String tempVal
存储, while(fileScan.hasNext())
确保扫描程序只在有行读取时才会继续读取。
现在,每行都有不同的信息,用"t"
分隔。 所以我用tempVal.split("t")
来分隔它们。 此外,使用计数器int i
并删除了for循环。 我猜测代码的其余部分是非常基本的,与你的代码没有多大区别。
**编辑****
这是输出
Rick James
8276 Carlos Ave
Las Vegas, NV 87126
5553451567 23.95
John Gibson
9127 Oak Dr
Corvallis, OR 97330
5552812313 156.78
Ron Wills
1155 Ivy Pl
Atlantic, Ga 37339
5552123145 189.56
Rita Jones
1259 Chase Ave
Las Vegas, NV 87126
5554445671 2145.6
Jason Knight
7154 Pine Dr
Gresjam, OR 97380
5558124545 3157.44
这里是我使用的示例text.file。
Rick James 8276 Carlos Ave Las Vegas NV 87126 5553451567 23.95
John Gibson 9127 Oak Dr Corvallis OR 97330 5552812313 156.78
Ron Wills 1155 Ivy Pl Atlantic Ga 37339 5552123145 189.56
Rita Jones 1259 Chase Ave Las Vegas NV 87126 5554445671 2145.60
Jason Knight 7154 Pine Dr Gresjam OR 97380 5558124545 3157.44
这里有一个提示:在调用next
方法来检查元素是否存在之前,使用Scanner时使用hasNextXXX
方法
https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html
没有这样的元素例外?
Scanner fileScan = new Scanner(new File("Lab2.txt"));
//PersonStats[] Donators = new PersonStats[25];
while(fileScan.hasNext()) {
line = fileScan.nextLine();
String parts[] = line.split("t");
if(parts.length == 10) {
FirstName = parts[0];
...
}
加入中有一些问题。 第一:字符串不可变。 因此,您的lineScanner将使用空字符串创建。 如果稍后更改此字符串,则此扫描程序没有任何内容,因为您使用此步骤创建了一个新字符串。
其次你必须检查下一个元素。 (请参阅我的while循环)
为了解析你的数据,easyer将字符串分成几部分并用它来填充你的类。 但是如果你想使用Scanner类,你必须在你的文件的每行实例上创建(在while循环中)
链接地址: http://www.djcxy.com/p/96093.html上一篇: Java encountering runtime errors while trying to read text file
下一篇: Scanner Class Error