Mientras usaba el método nextInt () de Java, me encontré con este código:

Scanner scan = new Scanner(System.in);
int count = scan.nextInt();
String string1 = scan.nextLine();

Sé que string1 contendría una cadena vacía. Mi pregunta es por qué llamar al método nextLine dos veces como sigue da error:

String string1 = scan.nextLine().nextLine();
0
Sanket Jain 10 sep. 2018 a las 18:10

4 respuestas

La mejor respuesta

Aquí:

String string1 = scan.nextLine().nextLine();

Vamos a dividirlo:

String string1 = scan.nextLine()

Llama a nextLine() en un escáner. Devuelve una cadena .

Por lo tanto, su código se reduce a

String string1 = someOtherString.nextLine(); 

Que, por supuesto, no puede funcionar. ¡Porque la clase String no tiene idea de una línea siguiente y, por lo tanto, no existe tal método!

Recuerde: el escáner devuelve una cadena, y estos son dos objetos muy diferentes.

Si sacas un huevo de una caja, ¿por qué esperarías que puedas sacar otro huevo de ese huevo que tienes? Puede sacar dos huevos de la misma caja, pero no un huevo de un huevo.

Finalmente: sí, existe la idea de API "fluidas", que permiten encadenar llamadas a métodos de "tales" formas. Pero ese puede solo funciona para escenarios diseñados específicamente para eso.

8
GhostCat 10 sep. 2018 a las 15:18

Ref: ¿Por qué nextLine () devuelve una cadena vacía?

scannerObj.nextInt() no lee el siguiente carácter de nueva línea, por lo que la primera línea siguiente (que devuelve el resto de la línea actual) will always return an empty string.

Esto debería funcionar:

int count = readInput.nextInt();
readInput.nextLine();

String input=readInput.nextLine();
1
Ashvin solanki 10 sep. 2018 a las 15:50

Mire el tipo de retorno de Scanner#nextLine(). Devuelve un String, no un Scanner.

Lo que escribiste es equivalente a:

String string1 = scan.nextLine();
String string2 = string1.nextLine();

Las cadenas de métodos son para saltar de un objeto a otro según lo definido por el tipo de retorno de cada método, haciendo que su código sea más compacto y reduciendo la cantidad de declaraciones que realiza.

0
Justin Reeves 10 sep. 2018 a las 15:25

¿Cómo depurar esto?

Creo que lo que es más importante que una respuesta simple es información sobre cómo depurar esto.

Suponiendo que esté en un IDE como IntelliJ o Eclipse, tienen muchas funciones para esto (buscarlas en Google es fácil).

Para IntelliJ, por ejemplo:

  • ctrl + q en el nombre de un método le mostrará su tipo de retorno e información al respecto.
  • Si solo escribe la primera llamada al método en una línea, puede hacer alt + enter y decirle que cree la variable local. Esto lo hará para el tipo correcto (que habría sido String, lo que lo hace obvio.
  • También puede hacer ctrl + b para saltar a la llamada de función y ver que devuelve un String claramente.
  • Además, el depurador lo habría hecho bastante obvio.

Java Doc

Además, siempre puede saltar al documento de Java para el escáner en Google con bastante facilidad.

https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#hasNextLine()

En realidad, los documentos de Java a menudo están disponibles o se pueden descargar en su IDE cuando salta a las funciones con ctrl + b que lo ahorra incluso usando un navegador :).

Respuesta básica

Pero en cualquier caso, su problema aquí es solo que la primera llamada a la función devuelve una Cadena, que no es un escáner, por lo que no puede usar la función de escáner en ella :).

1
John Humphreys - w00te 10 sep. 2018 a las 15:18