2011-11-07 22 views
7

Así que aquí es mi código:Sin excepción de dicho elemento?

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 alguna razón, me sale un elemento Tal excepción no

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) 

No estoy seguro de por qué sin embargo. Básicamente mi programa está buscando a través de dos archivos de texto: armor.txt y TreasureClassEx.txt. getTreasureClass recibe una clase de tesoro de un monstruo y busca a través del texto hasta que alcanza un elemento de armadura base (una cadena que no comienza con tc :.) Luego busca en getArmor una armadura que coincida con el nombre de la armadura base que recibió clase del tesoro ¡Cualquier consejo sería apreciado! ¡Gracias!

El enlace a los archivos TXT es aquí: http://www.cis.upenn.edu/~cis110/hw/hw06/large_data.zip

+0

Sería bueno si pudiera marcar las líneas de código mencionadas en el seguimiento de pila usando comentarios para que podamos obtener un punto de referencia. –

+0

¿Se puede publicar el contenido del archivo? – Tom

Respuesta

12

Parece que está llamando al lado, incluso si el escáner no tiene un elemento de lado para proporcionar ... tirar la excepción.

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

debe 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 
+0

Probé tu código para eso, pero luego recibí una excepción de elemento no para mi próximo/máximo nextInt(), que es raro porque el bucle no se rompe cuando es igual al tesoro?¿No debería haber todavía una próxima int después de eso? Por cierto, vinculé los archivos txt en mi publicación principal, el relevante es armor.txt y TreasureClassEx.txt. ¡Gracias! – Akaraka

+0

Edité mi respuesta para ser un poco más claro. Es posible que no encuentres ningún tesoro ... así que tus llamadas a nextInt fallarían aquí ya que no hay más tokens para leer. Probaría con algo como el código anterior, y agregaría una depuración para ver si file.next(). Equals (treasure) alguna vez se evalúa como verdadero. – Bryan

0

parece que su file.next() línea en el bucle while es tirar el NoSuchElementException desde el escáner alcanza el final del archivo. Lea la siguiente() java API here

También no debe llamar a next() en el bucle y también en el estado while. En la condición de tiempo deberías verificar si el token siguiente está disponible y dentro del ciclo while comprobar si es igual a un tesoro.

0

Sé que esta pregunta se me pidieron hace 3 años, pero sólo tenía el mismo problema, y ​​lo resuelto era en vez de poner:

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

lo hice una iteración en la salida, y después se comprueba para condición usando:

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

espero que esto ayudará a algunas personas en algún momento.

0

Me encontré con el mismo problema mientras lidiaba con grandes conjuntos de datos. Una cosa que noté fue que el NoSuchElementException se lanza cuando el escáner alcanza el endOfFile, donde no va a afectar nuestros datos.

Aquí, he colocado mi código en try block y catch block maneja el exception. También puede dejarlo vacío, si no desea realizar ninguna tarea.

Para la pregunta anterior, porque está utilizando file.next() tanto en el estado y en el bucle while se puede controlar la excepción como

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

Esto funcionó perfectamente para mí, si hay casos de esquina para mi enfoque, házmelo saber a través de comentarios.

+1

[los bloques de captura vacíos son generalmente una mala idea] (https://stackoverflow.com/questions/1234343/why-are-empty-catch-blocks-a-bad-idea) –

Cuestiones relacionadas