Java在尝试读取文本文件时遇到运行时错误

时间:2016-04-14 06:28:51

标签: java

我目前正在尝试按顺序编写一个Java任务;

  1. 阅读预先写好的文本文件的每一行
  2. 将每一行转换为字符串
  3. 将每行的每个部分转换为各自的字符串/ int / double
  4. 将这些变量分配给一个类的对象(它是一个对象数组的一部分),这个类我也是作为此作业的一部分创建的
  5. 使用类'之一打印对象的每个变量。方法
  6. 但是,我反复遇到运行时问题,我收到此错误消息;

      

    线程中的异常" 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

3 个答案:

答案 0 :(得分:1)

这里有一个提示:在使用扫描程序时,在调用hasNextXXX方法之前使用next方法来检查元素是否存在

https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html

No Such Element Exception?

答案 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 tempValwhile(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