Diferença entre next() e nextLine()

/*

  • To change this license header, choose License Headers in Project Properties.
  • To change this template file, choose Tools | Templates
  • and open the template in the editor.
    */
    package javaapplication7;

import java.util.Scanner;
import java.math.*;

/**
*

  • @author Danilo
    */
    public class JavaApplication7 {

    /**

    • @param args the command line arguments
      */
      public static void main(String[] args) {
      // TODO code application logic here
      Scanner in = new Scanner(System.in);
      int contador;
      float n1, n2;
      String resp;

      resp = in.nextLine();

      System.out.println("Insira o promeiro número: ");
      n1 = in.nextFloat();

      System.out.println("Insira o segundo número: ");
      n2 = in.nextFloat();

      while ( resp.equals(“sim”)){

       if ( n1 % 2 == 0){
           System.out.printf("O número %.1f é par \n ", n1);
       }else{
           
               System.out.format("O número %.1f é impar \n ", n1);
           
       }
       
       if ( n2 % 2 == 0){
           System.out.printf("O número %.1f é par \n", n2);
       }else{
           System.out.format("O número %.1f é impar  \n ", n1);
       }
       
       
       System.out.println("Você quer continuar?");
       resp = in.nextLine();
      
      • este " resp = in.nextLine(); " não esta funcionando.
      • Com “resp = next();” funciona, mas gostaria de saber o porquê da diferença entre os
        dois comandos */

      }

    }

}

  • pergunta comentada abaixo do erro ;), vlww!!

O scanner recupera a entrada dos dados em partes, e essas partes são delimitadas por espaço em branco por padrão. Com isso, ao usar next retorna o texto até encontrar esse delimitador, ou seja, ao digitar “asdf asdf asdf”, o valor capturado será apenas “asdf”.

Ex.:

String next = teclado.next(); // entrada: "asdf asdf asdf"
System.out.println(next); // saida: "asdf"

Já com o nextLine, o delimitador é uma quebra de linha. Com isso, todo o texto informado será recuperado até que uma quebra de linha é encontrada.

Ex.:

String nextLine = teclado.nextLine(); // entrada: "asdf asdf asdf"
System.out.println(nextLine); // saida: "asdf asdf asdf"

A Scanner breaks its input into tokens using a delimiter pattern, which by default matches whitespace.

FONTE: https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html
Scanner#next
Scanner#nextLine

6 curtidas

Excelente explicação do colega @Lucas_Camara.

Além do mais, tem outra questão importante que eu não sei o motivo dos professores não ensinarem/explicarem:

Quando você usa a classe Scanner para ler entrada de dados a partir do TECLADO, você deveria utilizar somente o método nextLine(), pois ele é o único que consome a quebra de linha gerada ao pressionar o ENTER.

Se você usa os outros métodos, como por exemplo nextFloat(), ele vai deixar os bytes da quebra de linha no buffer de memória, é por isso que a sua chamada ao nextLine() não funcionava, pois você fez a seguinte sequência:

n1 = in.nextFloat(); // leu um 'float', mas a quebra de linha ficou "pendurada" na memória

n2 = in.nextFloat(); // leu outro 'float', mas novamente a quebra de linha ficou "pendurada" na memória

resp = in.nextLine(); // chamou o 'nextLine' que, ao invés de retornar seu texto, primeiro consumiu uma quebra de linha que o 'nextFloat()' deixou "pendurada" na memória e retornou vazio ("").
3 curtidas