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

我目前正在尝试编写一个应该按顺序排列的Java任务;

  • 阅读预先编写的文本文件的每一行
  • 将每一行变成一个字符串
  • 将每一行的每个部分转换为它自己的字符串/ int / double
  • 将这些变量分配给作为此作业的一部分而创建的类的对象(它是对象数组的一部分)
  • 使用其中一个类的方法打印对象的每个变量
  • 但是,我反复遇到一个运行时问题,我收到此错误消息;

    在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 fileScanScanner 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