【问题标题】:Why am I getting "NoSuchElementException" When I can print everything from textfile?当我可以从文本文件中打印所有内容时,为什么会出现“NoSuchElementException”?
【发布时间】:2022-10-06 15:21:05
【问题描述】:

我能够从文本文件中读取所有内容并打印数据,但我得到一个“没有这样的元素”异常。我发现的所有解决方案都说在 while 循环中使用“HasNext”,但它似乎对我不起作用

public void fileReader() 抛出 IOException {

    String id;
    String brand;
    int yearOfManufacture;
    int numSeats;
    double rentalPerDay;
    double insurancePerDay;
    double serviceFee;
    double discount;
    String model;
    String type;
    String color;
    ArrayList<Vehicle> vehicleArray = new ArrayList<>();
    File file = new File(\"C:/Users/jockg/Downloads/Fleet (1).csv\");
    Scanner scan = new Scanner(file);
    scan.useDelimiter(\"n/n\");

    while (scan.hasNext() || scan.hasNextDouble() || scan.hasNextInt()) {

        id = scan.next();
         System.out.println(id);
        brand = scan.next();
         System.out.println(brand);
        model = scan.next();
         System.out.println(model);
        type = scan.next();
         System.out.println(type);
        yearOfManufacture = Integer.parseInt(scan.next());
         System.out.println(yearOfManufacture);
        numSeats = Integer.parseInt(scan.next());
         System.out.println(numSeats);
        color = scan.next();
         System.out.println(color);
        rentalPerDay = Double.parseDouble(scan.next());
         System.out.println(rentalPerDay);
        insurancePerDay = Double.parseDouble(scan.next());
         System.out.println(insurancePerDay);
        serviceFee = Double.parseDouble(scan.next());
         System.out.println(serviceFee);
        if (scan.next().equals(\"N/A\")) {
            discount = 0;
        } else {
            discount = Double.parseDouble(scan.next());
        }

         System.out.println(discount);

        Car newCar = new Car(id, brand, yearOfManufacture, numSeats, rentalPerDay, insurancePerDay, serviceFee,
                discount, model, type, color);
        vehicleArray.add(newCar);
    }
}

C001,丰田,雅力士,轿车,2012,4,蓝色,50,15,10,10 C002,丰田,卡罗拉,哈奇,2020,4,白色,45,20,10,10 C003,丰田,克鲁格,SUV,2019,7,灰色,70,20,20,10 C004,奥迪,A3,轿车,2015,5,红色,65,10,20,10 C005,霍顿,科鲁兹,哈奇,2020,4,绿色,70,10,10,10 C006,宝马,X5,SUV,2018,7,白色,100,25,20,10 C007,宝马,320i,轿车,2021,5,灰色,75,10,15,N/A C008,福特,福克斯,轿车,2014,5,红色,45,10,10,N/A C009,福特,彪马,SUV,2015,5,黑色,70,20,15,20

这是我得到的例外:

  • 在检查一次scan.hasNext() 之后,您将调用scan.next() 十次,因此如果任何行没有所需的字段数,您将收到错误消息。也许使用 CSV 解析库。
  • 您可能还需要解释分隔符 (n/n) - 您是否打算在换行符上进行分隔?

标签: java io nosuchelementexception


【解决方案1】:
if (scan.next().equals("N/A")

可能是你的问题。从它的样子来看,这不是你打算做的事情。

当您调用scan.next() 时,无论是否等于“N/A”,它都会读取

您在此之后添加了一个 else 语句并说 discount = Double.parseDouble(scan.next() 并且我认为您正在谈论您在初始 if 语句中调用的相同 scan.next() ,但是该行已经通过了。您需要将此scan.next() 存储在一个变量中,然后检查它是否为“N/A”。

【讨论】:

  • 不幸的是,删除 if 语句后,我仍然遇到同样的错误。不太确定这个去哪里!
【解决方案2】:
  • 您的 CSV 实际上有两个分隔符:逗号和换行符。试试看:scan.useDelimiter(",|\\R");
  • 为数值读取两次折扣,请尝试:
    String discountStr = scan.next();
    discount = discountStr.equals("N/A") ? 0 : Double.parseDouble(discountStr);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多