没有这样的元素例外?

时间:2011-11-07 02:13:58

标签: java exception

所以这是我的代码:

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

5 个答案:

答案 0 :(得分:15)

即使扫描仪不再有下一个元素提供......抛出异常,看起来你正在调用next。

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

答案 1 :(得分:0)

看起来你的while循环中的file.next()行抛出了NoSuchElementException,因为扫描程序已到达文件末尾。阅读next()java API here

此外,您不应该在循环中调用next(),也不应该在while条件中调用next()。在while条件下,您应检查下一个令牌是否可用,并在while循环内检查它是否等于宝藏。

答案 2 :(得分:0)

我知道3年前这个问题已经解决了,但我遇到了同样的问题,解决它的问题不是放在:

UPDATE [TableName]
SET [Image] = 'lengthy string
with over
1000 hard returned lines'
WHERE [ItemKey] = 1

我在开始时进行了一次迭代,然后使用以下方法检查条件:

 while (i.hasNext()) {
    // code goes here 
}

我希望这会在某个阶段帮助一些人。

答案 3 :(得分:0)

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

在此,我已将代码放入try blockcatch block处理exception。如果您不想执行任何任务,也可以将其留空。

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

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

这对我来说非常有用,如果我的方法有任何角落的情况,请通过评论告诉我。

答案 4 :(得分:0)

另一个出现相同问题的情况, map.entrySet().iterator().next()

如果Map对象中没有元素,则以上代码将返回NoSuchElementException。确保先致电hasNext()