我目前正在尝试按顺序编写一个Java任务;
但是,我反复遇到运行时问题,我收到此错误消息;
线程中的异常" main" java.util.NoSuchElementException at java.util.Scanner.throwFor(Scanner.java:862) 在java.util.Scanner.next(Scanner.java:1371) 在Lab2.main(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
答案 0 :(得分:1)
这里有一个提示:在使用扫描程序时,在调用hasNextXXX
方法之前使用next
方法来检查元素是否存在
https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html
答案 1 :(得分:0)
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];
...
}
加法中存在一些问题。 第一:String ist不可变。因此,您的lineScanner将使用空String创建。如果您以后更改此字符串,则此扫描程序不会添加任何内容,因为您使用此步骤创建了一个新字符串。
其次,您必须检查下一个元素。 (见我的while循环)
要解析数据,您可以更轻松地将字符串拆分为零,然后使用它来填充您的类。但是如果你想使用Scanner类,你必须在你的文件中每行创建一个实例。(在while循环中)
答案 2 :(得分:0)
好的,这是
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
将逐行读取文件,我将存储在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