没有这样的元素例外?

2022-09-04 21:12:21

这是我的代码:

public static void getArmor(String treasure)
    throws FileNotFoundException{
    Random rand=new Random();
    Scanner file=new Scanner(new File ("armor.txt"));
    while(!file.next().equals(treasure)){
        file.next(); //stack trace error here
        }
    int min=file.nextInt();
    int max=file.nextInt();
    int defense=min + (int)(Math.random() * ((max - min) + 1));
    treasure=treasure.replace("_", " ");
    System.out.println(treasure);
    System.out.println("Defense: "+defense);
    System.out.println("=====");
    System.out.println();
    }

public static void getTreasureClass(Monster monGet)
throws FileNotFoundException{
    Random rand = new Random();
    String tc=monGet.getTreasureClass();
    while (tc.startsWith("tc:")){
        Scanner scan=new Scanner(new File ("TreasureClassEx.txt"));
        String eachLine=scan.nextLine();
        while(!tc.equals(scan.next())){
        eachLine=scan.nextLine();
        }
        for (int i=0;i<=rand.nextInt(3);i++){
            tc=scan.next();
        }
    getArmor(tc); //stack trace error here
    }
 }

由于某种原因,我得到了一个没有这样的元素异常

    at java.util.Scanner.throwFor(Scanner.java:907)
at java.util.Scanner.next(Scanner.java:1416)
at LootGenerator.getArmor(LootGenerator.java:43)
at LootGenerator.getTreasureClass(LootGenerator.java:68)
at LootGenerator.getMonster(LootGenerator.java:127)
at LootGenerator.theGame(LootGenerator.java:19)
at LootGenerator.main(LootGenerator.java:11)

我不知道为什么。基本上,我的程序正在搜索两个文本文件 - armor.txt和TreasureClassEx.txt。getTreasureClass从怪物那里接收宝藏类,并在txt中搜索,直到它到达基本装甲物品(不以tc:开头的字符串:.)然后,它会在getArmor上搜索一种与它在宝藏类中获得的基础盔甲名称相匹配的盔甲。任何建议将不胜感激!谢谢!

指向txt文件的链接在这里:http://www.cis.upenn.edu/~cis110/hw/hw06/large_data.zip


答案 1

看起来您正在调用下一个,即使扫描仪不再有下一个元素要提供...引发异常。

while(!file.next().equals(treasure)){
        file.next();
        }

应该是这样的

boolean foundTreasure = false;

while(file.hasNext()){
     if(file.next().equals(treasure)){
          foundTreasure = true;
          break; // found treasure, if you need to use it, assign to variable beforehand
     }
}
    // out here, either we never found treasure at all, or the last element we looked as was treasure... act accordingly

答案 2

我在处理大型数据集时遇到了同样的问题。我注意到的一件事是,当扫描仪到达时,它被抛出,它不会影响我们的数据。NoSuchElementExceptionendOfFile

在这里,我放置了我的代码并处理了 .如果您不想执行任何任务,也可以将其留空。try blockcatch blockexception

对于上述问题,由于您在条件和 while 循环中都使用,因此您可以将异常处理为file.next()

while(!file.next().equals(treasure)){
    try{
        file.next(); //stack trace error here
       }catch(NoSuchElementException e) {  }
}

这对我来说非常有效,如果我的方法有任何角落案例,请通过评论让我知道。