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

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

nomedovetor1[i] = entrada.next();

nomedovetor1[i] = entrada.nextLine();
1 curtida

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.

3 curtidas

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.

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

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

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.

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");
System.out.print("Informe o nome do cliente “+(i+1)+”: "); <==============================
nomes[i] = entrada.nextLine();

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 |
| |
==============================

Este não era o resultado esperado?

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.

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.

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?

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

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 |
| |
==============================

Informe preço do prato do cliente : Maria
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

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
3 curtidas

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");
        }
    }
}
2 curtidas

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…

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

tem alguma que leia mesmo depois da quebra de linha?

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.

1 curtida