Java 我如何修复我的NoTouchElementException?

Java 我如何修复我的NoTouchElementException?,java,exception-handling,Java,Exception Handling,我尝试了许多不同的方法来修复错误。我知道这与hasNext有关,我只是不确定错误在哪里。请帮忙。另外,如果有人能告诉我如何从getLargestQuantityItem方法将变量largestQuantity的值输入到main方法中,我将不胜感激。干杯 以下是一个.txt文件的输入文件: The Shawshank Redemption 100 19.95 DVD The Dark Knight 50 19.95 DVD Casablanca 137 9.95 DVD The Girl With

我尝试了许多不同的方法来修复错误。我知道这与hasNext有关,我只是不确定错误在哪里。请帮忙。另外,如果有人能告诉我如何从getLargestQuantityItem方法将变量largestQuantity的值输入到main方法中,我将不胜感激。干杯

以下是一个.txt文件的输入文件:

The Shawshank Redemption
100
19.95
DVD
The Dark Knight
50
19.95
DVD
Casablanca
137
9.95
DVD
The Girl With The Dragon Tattoo
150
14.95
Book
Vertigo
55
9.95
DVD
A Game of Thrones
100
8.95
Book
这是我的密码:

import java.util.*;
import java.io.*;

public class Project01 {

public static void main(String[] args) {
    ArrayList<String> Titles = new ArrayList<String>();
    ArrayList<String> Types = new ArrayList<String>();
    ArrayList<Double> Prices = new ArrayList<Double>();
    ArrayList<Integer> Quantities = new ArrayList<Integer>();
    int count = 0;
    Scanner in = new Scanner(System.in);
    String database = getFile(in);
    try {
        File file = new File(database);
        Scanner inputFile = new Scanner(file);
        System.out.println();
        System.out.println("Product Summary Report");
        System.out.println("------------------------------------------------------------");
        while (inputFile.hasNext()) {
            getTitle(Titles, inputFile.nextLine());
            getQuantity(Quantities, inputFile.nextInt());
            getPrice(Prices, inputFile.nextDouble());
            getType(Types, inputFile.next());
            System.out.println("Title: " + Titles.get(count));
            System.out.println(" Product Type: " + Types.get(count));
            System.out.println(" Price: " + Prices.get(count));
            System.out.println(" Quantity: " + Quantities.get(count));
            System.out.println();
            count++;
            inputFile.next();
        }
        System.out.println("-----------------------------------------------------------------");
        System.out.println("Total products in database: " + count);
        System.out.println("Largest quantity item: " + largestQuantity);
        System.out.println("Highest total dollar item: ");
        System.out.println("Smallest quantity item: ");
        System.out.println("Lowest total dollar item: ");
        System.out.println("-----------------------------------------------------------------");
        inputFile.close();
    } catch (IOException e) {
        System.out.println("There was a problem reading from " + database);
    }
    in.close();
}
private static String getFile(Scanner inScanner) {
    System.out.print("Enter database filename: ");
    String fileName = inScanner.nextLine();
    return fileName;
}
private static void getTitle(ArrayList<String> Titles, String title) {
    Titles.add(title);
}
private static void getType(ArrayList<String> Types, String type) {
    Types.add(type);
}
private static void getPrice(ArrayList<Double> Prices, double price) {
    Prices.add(price);
}
private static void getQuantity(ArrayList<Integer> Quantities, int quantity) {
    Quantities.add(quantity);
}
private static void getLargestQuantityItem(ArrayList<Integer> Quantities){
    Integer largestQuantity = Collections.max(Quantities);
    }
}
参考post和您的txt文件

nextInt()
nextDouble()
方法之后添加
inputFile.nextLine()

getQuantity(Quantities, inputFile.nextInt());
inputFile.nextLine();
getPrice(Prices, inputFile.nextDouble());
inputFile.nextLine();
更改以下代码

getType(Types, inputFile.nextLine());
并删除
inputFile.next()在while循环结束时

第二种方法是在
next()周围添加if块方法调用

if (inputFile.hasNext()) {
    inputFile.next();
}
问题是
next()在while循环结束时读取下一个元素。但是在
Book
之后的文件末尾,没有什么可读的,所以它在该行抛出异常

更新:

largestQuantity
是一个局部变量,无法在方法之外访问它。您应该从
getLargestQuantityItem
方法返回它。因此,请更改方法的返回类型,然后返回最大值

private static Integer getLargestQuantityItem(ArrayList<Integer> Quantities){
    return Collections.max(Quantities);
}
主要方法

List<Double> totalPriceList = generateTotalPriceList(Prices, Quantities);
List totalPriceList=生成totalPriceList(价格、数量);

现在,您可以按照我们对
Quantity

所做的步骤进行操作。您是否尝试调试代码并提供堆栈跟踪。请检查
hasNext()
一次,但是在循环中,您会得到多个项目——其中任何一个都可能失败——堆栈跟踪应该准确地告诉您,在catch块中,add
e.printStackTrace()
然后再次执行并查看堆栈跟踪。传入的文件是什么?更改返回类型并将整数返回到main方法(从那里调用),因此在处理双列表时,必须使用(double)list.get(i)作为索引?这是给我带来麻烦的事情之一。如果你不把
(double)
放进去,那么它也不会给出任何编译错误。您可以使用或不使用(双精度)检查输出。
System.out.println("Lowest total dollar item: ");
Integer largestQuantityMainVariable = getLargestQuantityItem(Quantities);
System.out.println("Largest quantity : " + largestQuantityMainVariable);

int index;
for (int i = 0; i < Quantities.size(); i++) {
    if (Quantities.get(i) != null && Quantities.get(i).equals(largestQuantityMainVariable)) {
        index = i;
        break;
    }
}

System.out.println("Largest quantity item : " + Titles.get(index));
private static List<Double> generateTotalPriceList(List<Double> prices, List<Integer> quantities) {
    List<Double> totalPriceList = null;
    if (prices != null && prices.size() > 0
            && quantities != null && quantities.size() > 0) {
        if (prices.size() == quantities.size()) {
            totalPriceList = new ArrayList<Double>();
            double totalValue;
            for (int i = 0; i < prices.size(); i++) {
                totalValue = prices.get(i) * (double) quantities.get(i);
                totalPriceList.add(totalValue);
            }
        }
    }
    return totalPriceList;
}
List<Double> totalPriceList = generateTotalPriceList(Prices, Quantities);