Qual a diferença entre next() e nextLine()?

18 respostas
sintaxejava
F

Qual a diferença entre next() e nextLine()?

nomedovetor1[i] = entrada.next();

nomedovetor1[i] = entrada.nextLine();

18 Respostas

wldomiciano

A diferença entre ambos tem outras implicações, mas a situação mais obvia é quando se está “scaneando” uma String com espaços entre elas.

No código abaixo, se vc entrar com o texto “Testando Scanner”, o resultado seria apenas “Testando”.

class Program {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.println( scan.next() );
    }
}

Já no exemplo seguinte, o resultado seria a String completa (“Testando Scanner”).

class Program {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.println( scan.nextLine() );
    }
}

Ou seja, next() lê a String até o primeiro espaço enquanto nextLine() lê até encontrar uma quebra de linha.

F

String[] nomes = new String[media_de_cliente_por_dia];

for (int i = 0; i < media_de_cliente_por_dia; i++) {

System.out.print(Informe o nome do cliente +(i+1)+”: \n\n);

nomes[i] = entrada.nextLine();

}

Informe o nome do cliente 1:

=============================

| Escolha seu prato: |
=============================
| 1 - Massa R$: 19,85 |
| 2 - Parmegiana R$: 17,20 |
| 3 - Estrogonofe R$: 15,00 |
| 4 - Churrasco R$: 35,89 |
| |
==============================

Informe preço do prato do cliente : <=== localização do mouse.

Ex: Ana Maria da Silva

Com next();

Informe o nome do cliente 1:

Ana Maria da Silva
=============================
| Escolha seu prato: |
=============================
| 1 - Massa R$: 19,85 |
| 2 - Parmegiana R$: 17,20 |
| 3 - Estrogonofe R$: 15,00 |
| 4 - Churrasco R$: 35,89 |
| |
==============================

Exception in thread “main” java.util.InputMismatchException

Informe preço do prato do cliente Ana: 	at java.util.Scanner.throwFor(Scanner.java:864)

at java.util.Scanner.next(Scanner.java:1485)

at java.util.Scanner.nextDouble(Scanner.java:2413)

at restaurante.Restaurante.main(Restaurante.java:141)

/home/fernando/.cache/netbeans/8.2/executor-snippets/run.xml:53: Java returned: 1

FALHA NA CONSTRUÇÃO (tempo total: 14 segundos)

Só Ana funciona.

wldomiciano

Mas e o nextLine() da certo? Se não, posta o código completo.

F

Problema com espaço:

Não funciona

Informe o nome do cliente 1: 

Ana Maria de Souza

Exception in thread "main" java.util.InputMismatchException
	at java.util.Scanner.throwFor(Scanner.java:864)
	at java.util.Scanner.next(Scanner.java:1485)
	at java.util.Scanner.nextDouble(Scanner.java:2413)
	at restaurante.Restaurante.main(Restaurante.java:175)
Informe preço do prato do cliente Ana: netbeans/8.2/executor-snippets/run.xml:53: Java returned: 1
FALHA NA CONSTRUÇÃO (tempo total: 12 segundos)

Funciona

AnaMariadeSouza

wldomiciano

Poste o código completo pra eu ver.

Tá parecendo que vc tá chamando o nextDouble() depois de chamar o next() e isso vai dar erro mesmo.

Se substituir por nextLine() acho que resolve.

F

package restaurante;

import java.util.Scanner;

public class Restaurante {

public static void main(String[] args) {

Scanner entrada = new Scanner(System.in);

int media_de_cliente_por_dia = 2;

String[] nomes = new String[media_de_cliente_por_dia];

double[] pratos = new double[media_de_cliente_por_dia];

double[] bebida = new double[media_de_cliente_por_dia];

double[] sobremesa = new double[media_de_cliente_por_dia];

System.out.print("Deseja ter mais informações do Cardápio Eletrônico? [s/n]: "); <=== Tem diferença em usar System.out.print e System.out.println
String infor= entrada.nextLine();

if (infor.equals(“n”) || infor.equals(“N”)){

for (int i = 0; i < media_de_cliente_por_dia; i++) {

System.out.println("\n\nObs: Não usar espaço no nome. \n");

<strong>System.out.print("Informe o nome do cliente “+(i+1)+”: "); <==============================</strong>

<strong>nomes[i] = entrada.nextLine();</strong>

Com System.out.print("Deseja ter mais informações do Cardápio Eletrônico? [s/n]: "); e .nextLine();

Informe o nome do cliente 1: Ana Maria da Silva
=============================
| Escolha seu prato: |
=============================
| 1 - Massa R$: 19,85 |
| 2 - Parmegiana R$: 17,20 |
| 3 - Estrogonofe R$: 15,00 |
| 4 - Churrasco R$: 35,89 |
| |
==============================

wldomiciano

Este não era o resultado esperado?

F

Parece que o problema é o ln no print.

Rodando o programa 2x com for tenho problema com formatação.

Informe o nome do cliente 1: Ana Maria da Silva
=============================
| Escolha seu prato: |
=============================
| 1 - Massa R$: 19,85 |
| 2 - Parmegiana R$: 17,20 |
| 3 - Estrogonofe R$: 15,00 |
| 4 - Churrasco R$: 35,89 |
| |
==============================

Informe preço do prato do cliente Ana Maria da Silva: 19
=============================
| Escolha sua bebida: |
=============================
| 1 - Água R$: 2,00 |
| 2 - Água de coco R$: 5,00 |
| 3 - Suco de uva R$: 3,00 |
| 4 - Refrigerante R$: 2,50 |
| |
=============================

Informe o preço da bebida do cliente Ana Maria da Silva: 2
================================
| Escolha sua sobremesa: |
================================
| 1 - Torta de Limão R$: 5,00 |
| 2 - Pudim de Leite R$: 4,50 |
| 3 - Mousse de Limão R$: 7,58 |
| 4 - Pavê R$: 8,20 |
| |
================================

Informe o preço da sobremesa do cliente Ana Maria da Silva: 1


Total para o cliente Ana Maria da Silva R$: 22.0

Não tem problema:

System.out.print("Informe o nome do cliente "+(i+1)+": ");
nomes[i] = entrada.next();

Com problema de formatação e não pega o nome depois do 2 laço.

System.out.print("Informe o nome do cliente “+(i+1)+”: ");
nomes[i] = entrada.nextLine();

Informe o nome do cliente 2: =============================
| Escolha seu prato: |
=============================
| 1 - Massa R$: 19,85 |
| 2 - Parmegiana R$: 17,20 |
| 3 - Estrogonofe R$: 15,00 |
| 4 - Churrasco R$: 35,89 |
| |
==============================

Informe preço do prato do cliente : <== A variável nome para o cliente 2 começa aqui.

wldomiciano

Não sabia que esse ln poderia afetar. Vou fazer uns testes amanhã.

Seria legal, se puder, se vc postasse o código completo ou, pelo menos, um trecho mínimo e executável que reproduza seu problema.

darlan_machado

Aprenda a ler o stack. A mensagem acima é bem clara, você espera ler um Double (nextDouble) e não está passando um double (provavelmente uma String que não pode ser convertida para double).
Tem mesmo certeza que a linha 141 da classe Restaurante tem o código destacado?

F

Para simular o problema coloquei um nextLine() no nome do cliente para volta ao normal é só colocar next().

Neste código não tive problema com ln em System.out.print somente com nextLine() .

// Número de voltas do programa.

int mediadeclientepordia = 2;

// Declaração dos Vetores

String[] nomes = new String[mediadeclientepordia];

double[] pratos = new double[mediadeclientepordia];

double[] bebida = new double[mediadeclientepordia];

double[] sobremesa = new double[mediadeclientepordia];

// Um for para nome dos clientes.

// Inicio do for

for (int i = 0; i < mediadeclientepordia; i++) {

System.out.print("\n\nObs: Não usar espaço no nome. \n");

System.out.print("Informe o nome do cliente “+(i+1)+”: ");

nomes[i] = entrada.nextLine();

// Nome dos pratos dos clientes.

System.out.println("    =============================  ");
 System.out.println("   |       Escolha seu prato:    | ");
 System.out.println("    =============================  ");
 System.out.println("   | 1 - Massa       R$: 19,85    |");
 System.out.println("   | 2 - Parmegiana  R$: 17,20    |");
 System.out.println("   | 3 - Estrogonofe R$: 15,00    |");
 System.out.println("   | 4 - Churrasco   R$: 35,89    |");
 System.out.println("   |                              |");
 System.out.println("    ==============================\n");

System.out.print(“Informe preço do prato do cliente " +(nomes[i]) +”: ");

pratos[i] = entrada.nextDouble();

// Nome das bebidas dos clientes.

System.out.println("    =============================  ");
 System.out.println("   |       Escolha sua bebida:   | ");
 System.out.println("    =============================  ");
 System.out.println("   | 1 - Água           R$: 2,00  |");
 System.out.println("   | 2 - Água de coco   R$: 5,00  |");
 System.out.println("   | 3 - Suco de uva    R$: 3,00  |");
 System.out.println("   | 4 - Refrigerante   R$: 2,50  |");
 System.out.println("   |                              |");
 System.out.println("    =============================\n");

System.out.print("Informe o preço da bebida do cliente “+(nomes[i])+”: ");

bebida[i] = entrada.nextDouble();

// Nome das sobremesas dos clientes.

System.out.println("    ================================  ");
 System.out.println("   |       Escolha sua sobremesa:   | ");
 System.out.println("    ================================  ");
 System.out.println("   | 1 - Torta de Limão    R$: 5,00  |");
 System.out.println("   | 2 - Pudim de Leite    R$: 4,50  |");
 System.out.println("   | 3 - Mousse de Limão   R$: 7,58  |");
 System.out.println("   | 4 - Pavê              R$: 8,20  |");
 System.out.println("   |                                 |");
 System.out.println("    ================================ \n");

System.out.print("Informe o preço da sobremesa do cliente “+(nomes[i])+”: ");
sobremesa[i] = entrada.nextDouble();

// Apenas somar os valores existentes dentro do vetor

double [] vetor = {pratos[i],bebida[i],sobremesa[i]}; // Vetor já com valores preenchidos.

double soma = 0; // inicia variavel soma com 0.

for(int j = 0; j < vetor.length; j++){

soma = soma +  vetor[j]; // soma a variavel soma com cada valor dos indices do vetor.

}

System.out.println("-------------------------------------------------------");
System.out.println(“Total para o cliente “+nomes[i] +” R$: " +soma +”\n\n");

} // Fim do For

F

run:

Obs: Não usar espaço no nome.
Informe o nome do cliente 1: Ana
=============================
| Escolha seu prato: |
=============================
| 1 - Massa R$: 19,85 |
| 2 - Parmegiana R$: 17,20 |
| 3 - Estrogonofe R$: 15,00 |
| 4 - Churrasco R$: 35,89 |
| |
==============================

Informe preço do prato do cliente Ana: 1
=============================
| Escolha sua bebida: |
=============================
| 1 - Água R$: 2,00 |
| 2 - Água de coco R$: 5,00 |
| 3 - Suco de uva R$: 3,00 |
| 4 - Refrigerante R$: 2,50 |
| |
=============================

Informe o preço da bebida do cliente Ana: 1
================================
| Escolha sua sobremesa: |
================================
| 1 - Torta de Limão R$: 5,00 |
| 2 - Pudim de Leite R$: 4,50 |
| 3 - Mousse de Limão R$: 7,58 |
| 4 - Pavê R$: 8,20 |
| |
================================

Informe o preço da sobremesa do cliente Ana: 1

Total para o cliente Ana R$: 3.0

Obs: Não usar espaço no nome.
Informe o nome do cliente 2: =============================
| Escolha seu prato: |
=============================
| 1 - Massa R$: 19,85 |
| 2 - Parmegiana R$: 17,20 |
| 3 - Estrogonofe R$: 15,00 |
| 4 - Churrasco R$: 35,89 |
| |
==============================

<strong>Informe preço do prato do cliente : Maria</strong>

Exception in thread “main” java.util.InputMismatchException

at java.util.Scanner.throwFor(Scanner.java:864)

at java.util.Scanner.next(Scanner.java:1485)

at java.util.Scanner.nextDouble(Scanner.java:2413)

at teste.Teste.main(Teste.java:95)

executor-snippets/run.xml:53: Java returned: 1

FALHA NA CONSTRUÇÃO (tempo total: 17 segundos)

O problema que esta pulando quando usa o nextLine().

Na 2 volta do programa:

Informe o nome do cliente 2: =============================

Informe preço do prato do cliente : Maria

darlan_machado

Cara, entenda uma coisa, o Scanner tem suas definições e você precisa entendê-las para poder utilizá-lo de maneira correta.
Provavelmente a proposição do exercício seja proposital (eu fazia isso quando dava aulas).
Veja, o método nextLine lê tudo o que foi digitado pelo usuário, até encontrar a quebra de linha (\n que representa o enter pressionado pelo usuário informando o fim da instrução).
Para os demais métodos (next, nextInt, nextDouble, nextFloat, nextLong, nextBoolean), o Scanner vai ler apenas a parte cabível ao tipo de dado esperado. O next lê só o primeiro trecho digitado, ou seja, quando encontra um espaço ou \n, ele para de ler e dá sequência.
Já o nextDouble, por exemplo, vai ler a parte numérica que for cabível ao tipo Double (com ponto ou vírgula, dependendo do idioma da JRE instalada), ignorando a quebra (\n)

Como o restante do que foi informado e lido pelo next() continua lá no stream de entrada do System, o nextDouble() vai encontrar sujeira para ler.

Alternativas para isso?

Você pode ler tudo com nextLine, sem problemas.
Tanto Strings quanto números.
Quando for ler Strings, leia com nextLine

String nome = entrada.nextLine();

Assim você lê todo o conteúdo digitado, sem deixar sujeira no stream.
Quando for ler número

Double valor = Double.valueOf(entrada.nextLine());

Assim você lê o número como String, converte e já armazena na variável adequada.

Outra forma de fazer seria, após ler um valor como o nome (String) com next, invocar nextLine, apenas para limpar o stream de entrada

String nome = entrada.next();
entrada.nextLine();//Aqui lê tudo o que ficou após a leitura do nome, caso exista alto
wldomiciano

Testei seu código e entendi seu problema.

É exatamente como o @darlan_machado sugeriu. Substitua cada entrada.nextDouble() por Double.valueOf(entrada.nextLine()) e o código rodará como esperado e vc ainda vai poder usar espaços nos nomes.

Fiz umas alterações para demonstrar:

class Program {
    public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        int mediadeclientepordia = 2;

        String[] nomes = new String[mediadeclientepordia];
        double[] pratos = new double[mediadeclientepordia];
        double[] bebida = new double[mediadeclientepordia];
        double[] sobremesa = new double[mediadeclientepordia];

        for (int i = 0; i < mediadeclientepordia; i++) {
            System.out.print("Informe o nome do cliente " + (i+1) + ": ");
            nomes[i] = entrada.nextLine();

            System.out.print("Informe preço do prato do cliente " + nomes[i] + ": ");
            pratos[i] = Double.valueOf( entrada.nextLine() );

            System.out.print("Informe o preço da bebida do cliente " + nomes[i] + ": ");
            bebida[i] = Double.valueOf( entrada.nextLine() );

            System.out.print("Informe o preço da sobremesa do cliente " + nomes[i] + ": ");
            sobremesa[i] = Double.valueOf( entrada.nextLine() );

            double[] vetor = { pratos[i], bebida[i], sobremesa[i] };

            double soma = 0;

            for(int j = 0; j < vetor.length; j++)
                soma = soma + vetor[j];

            System.out.println("Total para o cliente " + nomes[i] + " R$: " + soma + "\n\n");
        }
    }
}
F

Tem conteúdo em pdf falando sobre Double valor = Double.valueOf(entrada.nextLine()); de forma bem simples passo a passo. Isso é novo para mim.

obs…

darlan_machado

Procure nas apostilas da caelum, na internet, nos livros.

JamesNotBond

tem alguma que leia mesmo depois da quebra de linha?

wldomiciano

No momento eu não sei, mas me explica o que vc quer fazer, talvez encontremos uma forma de alcançar o resultado que vc espera. Quanto mais detalhes vc der sobre sua tarefa, melhor.

Criado 7 de abril de 2018
Ultima resposta 8 de out. de 2020
Respostas 18
Participantes 4