所以这是我的代码:
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
答案 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 block
,catch 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()
。