Java 继承没有这样的元素?

Java 继承没有这样的元素?,java,file,inheritance,nosuchelementexception,Java,File,Inheritance,Nosuchelementexception,我寻找了一个类似的问题,但实际上无法将任何解决方案应用到我的问题上。我正在测试一个程序的代码,该程序应该从文件中读取有关购车的信息,但在我的TestDrive类中,它不断给出这个错误 Exception in thread "main" java.util.NoSuchElementException at java.util.StringTokenizer.nextToken(StringTokenizer.java:349) at Project4.TestDrive.main(TestDr

我寻找了一个类似的问题,但实际上无法将任何解决方案应用到我的问题上。我正在测试一个程序的代码,该程序应该从文件中读取有关购车的信息,但在我的TestDrive类中,它不断给出这个错误

Exception in thread "main" java.util.NoSuchElementException
at java.util.StringTokenizer.nextToken(StringTokenizer.java:349)
at Project4.TestDrive.main(TestDrive.java:24)
以下是我目前掌握的情况:

车辆等级:

public class Car
{
protected double dealerCost;
protected int idNum, modelYear;
protected Date dateA;
protected String makeModel;
public Car()
{
    dealerCost = 0;
    idNum = 0;
    dateA = new Date();
    modelYear = 0;
    makeModel = "";
}
public Car(double d, int i, Date da, int mY, String makeM)
{
    dealerCost = d;
    idNum = i;
    dateA = da;
    modelYear = mY;
    makeModel = makeM;
}
public double getDealerCost()
{   return dealerCost;}
public int getIDNumber()
{   return idNum;}
public Date getDateArrived()
{   return dateA;}
public int getModelYear()
{   return modelYear;}
public String getMakeModel()
{   return makeModel;}
public boolean equals(Car other)
{
    return Math.abs(dealerCost-other.dealerCost)<.0001&&
            idNum == other.idNum&&dateA.equals(other.dateA)&&
            modelYear==other.modelYear&&makeModel.equalsIgnoreCase(
            other.makeModel);
}
public String toString()
{
    return "Dealer Cost:\t"+dealerCost+"\nId Number:\t"+
            idNum+"\nDate Arrived:\t"+dateA+"\nMake:\t"+
            makeModel+"\nModel:\t"+modelYear;
}
}
SoldCar类别:

public class SoldCar extends Car
{
private double price;
private String customer;
private Date dateS;
private int i;
public SoldCar(double a, int b, Date v, int mY, String m, double p, String c, Date ds)
{
    super(a, b, v, mY, m);
    price = p;
    customer = c;
    dateS = ds;
}
public SoldCar(int c, double a, String s, Date ds)
{
    i = c;
    price = a;
    customer = s;
    dateS = ds;
}
public double getPrice()
{   return price;}
public String getCustomer()
{   return customer;}
public Date getDateSold()
{   return dateS;}
public Double calcProfit()
{ return(price-dealerCost);}
public String toString()
{
    return super.toString()+"\nPrice:\t"+price+"\nCustomer:\t"+
            customer+"\nProfit:\t"+calcProfit();
}
public boolean equals(SoldCar object)
{
    return super.equals(object)&&Math.abs(price-object.price)<.0001&&
            customer.equalsIgnoreCase(object.customer)&&dateS.equals(
            object.dateS);
}
}

更正
cars.txt
文件中的输入。“month”标记似乎丢失。

您不应该盲目调用
nextToken()
方法。最好的办法是在你知道还有下一个代币要买的时候给它打电话

    StringTokenizer t = new StringTokenizer("foo boo baz bar", " ");
    while(t.hasMoreTokens())
    {
        String token = t.nextToken();
        // Do something with the token
    }
在上面的代码中,我可以安全地调用
nextToken()
方法,因为只有当标记器对象通过
hasMoreTokens()
测试时,才会调用该方法


我的第二个建议是使用正则表达式获取所需的令牌(而不是调用
nextToken()
很多次了。我建议你找一本正则表达式教程,找出更好的方法来实现它。我还建议你使用一个在线正则表达式测试仪。这样,你就可以在线构建表达式并对其进行评估。这对我处理复杂正则表达式有很大的帮助。这是一个仅限正则表达式的工具我过去使用过的ne tester:

您应该用注释向我们指出哪一行引发异常。不仅缺少月份标记,而且该行的所有其他标记都丢失了……因此,您正在输入文件中查找一行,其中只有3个标记。最后一行必须有X。我想说,指向您输入的错误的指针正在获取此文件的输入行中。
import java.io.*;
import java.util.StringTokenizer;
public class TestDrive
{
public static void main(String[] args) throws IOException
{   StringTokenizer t;
    Car[] Info = new Car[13];
    int idNum, d, y, mY, q =0;
    String make, model, month, customer, l;
    Date B, S;
    double price, price2;

    FileReader fr = new FileReader("cars.txt");
    BufferedReader br = new BufferedReader(fr);
    String stringRead = br.readLine();
    t = new StringTokenizer(stringRead, " ");
    l = t.nextToken();
    while(l.charAt(0)!='X')
    {
        if(l.equalsIgnoreCase("c"))
        {
            price=Double.parseDouble(t.nextToken());
            idNum = Integer.parseInt(t.nextToken());
            month = t.nextToken();
            d = Integer.parseInt(t.nextToken());
            y = Integer.parseInt(t.nextToken());
            mY = Integer.parseInt(t.nextToken());
            model = t.nextToken();
            B  = new Date(month, d, y);
            Info[q] = new Car(price, idNum, B, mY, model);
            for(int i = 0; i < q; i++)
            {
                if(Info[q].getIDNumber()==idNum)
                {
                    System.out.println("Same idNumber as another"+
                            " car in the array!");
                    Info[q] = null;
                    q--;
                }
                if(Info[q].equals(Info[i])==true)
                {
                    System.out.println("This car showed up more than once: "+
                            Info[i].getIDNumber());
                }
            }
        }
        else if(l.equalsIgnoreCase("S1"))
        {
            idNum = Integer.parseInt(t.nextToken());
            price=Double.parseDouble(t.nextToken());
            customer=t.nextToken();
            month = t.nextToken();
            d = Integer.parseInt(t.nextToken());
            y = Integer.parseInt(t.nextToken());
            S=new Date(month, d, y);
            Info[q]=new SoldCar(idNum, price, customer, S);
            q++;
        }
        else
        {
            price=Double.parseDouble(t.nextToken());
            idNum = Integer.parseInt(t.nextToken());
            month = t.nextToken();
            d = Integer.parseInt(t.nextToken());
            y = Integer.parseInt(t.nextToken());
            mY = Integer.parseInt(t.nextToken());
            model = t.nextToken();
            B  = new Date(month, d, y);
            price2=Double.parseDouble(t.nextToken());
            customer = t.nextToken();
            month = t.nextToken();
            d = Integer.parseInt(t.nextToken());
            y = Integer.parseInt(t.nextToken());
            S = new Date(month, d, y);
            Info[q]=new SoldCar(price, idNum, B, mY, model,
                    price2, customer, S);
            for(int i = 0; i < q; i++)
            {
                if(Info[q].getIDNumber()==idNum)
                {
                    System.out.println("Same idNumber as another"+
                            " car in the array!");
                    Info[q] = null;
                    q--;
                }
                if(Info[q].equals(Info[i])==true)
                    System.out.println("This car showed up more than once: "+
                            Info[i].getIDNumber());
            }
        }
    }
    for(int i = 0; i < q; i++)
    {
        System.out.println("The remaining data in the array is: "+
                Info[q]);
    }}}
C 5000.00 1234 January 1 2004 2000 Honda_Accord
C 14000.00 3333 June 6 2003 1999 GMC_Suburban
C 5000.00 1222 January 1 2004 2000 Honda_Civic
C 10000.00 4444 July 10 2002 2001 Toyota_Tundra
S 1234 6000.00 Roth February 15 2004
S 1234 6200.00 Smith January 15 2004
S 3333 15500.00 Jones February 6 2004
S 3333 15650.00 Brown December 25 2003
S 1222 6500.00 Thomas January 21 2004
S 1234 5850.00 Hall January 15 2004
S 4444 11250.00 Baker January 21 2004
    StringTokenizer t = new StringTokenizer("foo boo baz bar", " ");
    while(t.hasMoreTokens())
    {
        String token = t.nextToken();
        // Do something with the token
    }