Nenhuma exceção de elemento?

Então aqui está o meu código:

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 } } 

Por alguma razão eu recebo uma exceção de nenhum tal elemento

  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) 

Eu não tenho certeza porque. Basicamente, meu programa está pesquisando dois arquivos de texto – armor.txt e TreasureClassEx.txt. getTreasureClass recebe uma class de tesouro de um monstro e procura através do txt até alcançar um item de armadura base (uma string que não inicia com tc :.) Então ele pesquisa getArmor por uma armadura que combina com o nome da armadura base em que ele entrou. class do tesouro. Qualquer conselho seria apreciado! Obrigado!

O link para os arquivos txt está aqui: http://www.cis.upenn.edu/~cis110/hw/hw06/large_data.zip

Parece que você está chamando em seguida, mesmo que o scanner não tenha mais um próximo elemento a ser fornecido … lançando a exceção.

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

Deve ser algo como

 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 

Parece que sua linha file.next () no loop while está lançando o NoSuchElementException desde que o scanner chegou ao final do arquivo. Leia a próxima API java () aqui

Além disso, você não deve chamar next () no loop e também na condição while. Na condição while você deve verificar se o próximo token está disponível e dentro do loop while verificar se é igual ao tesouro.

Eu sei que essa pergunta foi feita há 3 anos, mas eu só tive o mesmo problema, e o que resolvi foi em vez de colocar:

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

Eu fiz uma iteração no início e, em seguida, verifiquei a condição usando:

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

Espero que isso ajude algumas pessoas em algum momento.

Eu tinha encontrado o mesmo problema enquanto estava lidando com um grande dataset. Uma coisa que eu notei foi que o NoSuchElementException é lançado quando o Scanner atinge o endOfFile , onde ele não afeta nossos dados.

Aqui, coloquei meu código em try block e catch block manipula a exception . Você também pode deixá-lo vazio, se não quiser realizar nenhuma tarefa.

Para a pergunta acima, porque você está usando file.next() tanto na condição quanto no while você pode manipular a exceção como

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

Isso funcionou perfeitamente para mim, se existem casos de canto para a minha abordagem, deixe-me saber através de comentários.