El código de Java se cuelga en Scanner hasNextLine

En primer lugar, soy nuevo en Java e bash completar una tarea de la escuela para crear una máquina expendedora. Mi progtwig está tomando 2 archivos como argumentos de cli, uno para productos y otro para dinero.

Por mi vida, no puedo entender por qué el código está colgado en la línea 42

(while (moneyTemp.hasNextLine());) 

Intenté depurar en eclipse usando puntos de interrupción y noté que el código nunca pasa esta línea. Poniendo una statement de impresión dentro del bucle while, no obtengo la salida, así que sé que no está en bucle.

Los documentos de Java dicen que hasNextLine puede bloquear la espera de la entrada del usuario, pero como mi fuente es un archivo, no estoy seguro de por qué sucede esto. Ver código relevante a continuación.

 import java.util.Scanner; import java.io.File; import java.io.FileNotFoundException; public class VendingMachine { static Scanner input = new Scanner (System.in); public static void main(String[] args) { try { Scanner productTempFile = new Scanner(new File(args[0])); Scanner moneyTemp = new Scanner(new File(args[1])); int numProducts = 0; //Number of products to be loaded to the machines int numMoney = 0; //Number of money objects to be loaded in the machine while (productTempFile.hasNextLine()) //This block will get the number of products { numProducts++; productTempFile.nextLine(); } productTempFile.close(); Product[] invArray = new Product[numProducts]; Scanner myFile = new Scanner(new File(args[0])); for(int i = 0; i < numProducts; i++) //This block populates the array of products { String inputLine = myFile.nextLine(); String[] lineArray = inputLine.split(","); invArray[i] = new Product(lineArray[0], Double.valueOf(lineArray[1]), lineArray[2], lineArray[3], Double.valueOf(lineArray[4]), Integer.valueOf(lineArray[5])); } myFile.close(); System.out.println("I'm here"); while (moneyTemp.hasNextLine()); //This block gets the number of different money items { numMoney++; moneyTemp.nextLine(); } 

A continuación se muestra el segundo archivo que estoy suministrando, es decir, arg [1], que tiene el mismo formato que el primero que funciona.

 Papel, moneda de 100 dólares, 100.0, medio, papel, 0
 Papel, moneda de 50 dólares, 50.0, medio, papel, 0
 Papel, moneda, billete de 20 dólares, 20.0, mediano, papel, 0
 Papel, moneda de 10 dólares, 10.0, medio, papel, 4
 Papel, moneda de 5 dólares, 5.0, medio, papel, 8
 Papel, moneda de 1 dólar, 100.0, mediano, papel, 16
 Moneda de moneda, pieza de 50 centavos, 0.5, grande, metal, 10
 Moneda, moneda, cuarto, 0,25, medio, metal, 20
 Moneda, moneda de diez centavos, 0.1, pequeño, metal, 30
 Moneda de moneda, níquel, 0.05, pequeño, metal, 40
 Moneda de moneda, Penny, 0.01, pequeño, metal, 50

Cualquier ayuda será muy apreciada. Gracias

Eliminar el punto y coma de la línea

  while (moneyTemp.hasNextLine()); 

Semicolom hace que el bucle while complete su cuerpo sin hacer nada. Significa while(){} cuando la condición es verdadera, no hace nada y, dado que su condición es hasNextLine() , verifica la misma línea una y otra vez, causando un bucle infinito.

Al agregar el punto y coma ( ; ), implícitamente está haciendo que el ciclo while ejecute un bloque vacío. hasNextLine() no cambia el InputStream el que se basa el escáner, por lo que, como no hay nada en el cuerpo del ciclo while, no hay nada para cambiar el estado, y el ciclo continuará por siempre.

Simplemente suelta el punto y coma del bucle while, y estarás bien:

 while (moneyTemp.hasNextLine()) // no ; here! { numMoney++; moneyTemp.nextLine(); } 
    Intereting Posts