Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

System.out.format não funcionou

Olá, quando mudei do String.format para o System.out.format, deu uma exceção

Exception in thread "main" java.util.InputMismatchException
    at java.base/java.util.Scanner.throwFor(Scanner.java:939)
    at java.base/java.util.Scanner.next(Scanner.java:1594)
    at java.base/java.util.Scanner.nextDouble(Scanner.java:2564)
    at br.com.alura.java.io.test.TesteLeitura2.main(TesteLeitura2.java:26)

O que pode ser?

package br.com.alura.java.io.test;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Arrays;
import java.util.Locale;
import java.util.Scanner;

public class TesteLeitura2 {

    public static void main(String[] args) throws FileNotFoundException {
        Scanner scanner = new Scanner(new File("contas.csv"));

        while (scanner.hasNextLine()) {
            String linha = scanner.nextLine();
            //System.out.println(linha);

            Scanner linhaScanner = new Scanner(linha);
            //linhaScanner.useLocale(Locale.US);
            linhaScanner.useDelimiter(",");

            String tipoConta = linhaScanner.next();
            int agencia = linhaScanner.nextInt();
            int numero = linhaScanner.nextInt();
            String titular = linhaScanner.next();
            double saldo = linhaScanner.nextDouble();

            System.out.format(new Locale("pt","BR"), "%s - %04d-%08d, %20s: %08.2f %n", 
                    tipoConta, agencia, numero, titular, saldo);

            linhaScanner.close();

//            String[] valores = linha.split(",");
//            System.out.println(Arrays.toString(valores ));
        }

        scanner.close();
    }

}
7 respostas

Olá Roger,

Pelo que pude ver da exceção, parece que o problema está acontecendo na leitura e não na formatação dos dados.

A exceção provavelmente está indicando que o código está tentando ler um double mas está encontrando algum outro tipo de dado naquela posição. Dá um conferida no seu arquivo de entrada pra ver se todos os dados estão corretos.

Acho que é uma boa você postar aqui também o conteúdo desse arquivo pra gente poder ajudar, ok?

Acredito que o erro esteja acontecendo por causa do Locale, o double deve estar esperando "," para a conversão, porém esta recebendo um ".", o seu codigo linhaScanner.useLocale(Locale.US); esta comentando, se você descomentar esta parte, provavelmente o seu codigo voltará a funcionar, pois para cada linha você esta utilizando um padrão em que o double estará esperando um "."

Olá,

Segue:

CC,22,33,Nico Steppat,210.1
CP,11,55,Sérgio Gomes,1300.98
CC,22,44,Ana Garcias,350.40

Olá Roger,

O que o Fernando comentou ali em cima faz todo sentido. O scanner está tentando ler o double usando o locale padrão da máquina então ele vai buscar números decimais com vírgula e não vai encontrar então isso explica a exceção de InputTypeMismatch.

Faça o teste de descomentar a linha como o Fernando sugeriu e confirma aqui pra gente se funcionou.

Olá,

Descomentando a linha linhaScanner.useLocale(Locale.US), o código funcionou.

O que me chamou a atenção foi que no System.out.format há um new Locale("pt","BR"). Isso não conflitaria com o linhaScanner.useLocale(Locale.US) ?

solução!

Olá Roger,

Nesse caso são dois locales para dois momentos diferentes.

O primeiro locale é usado para fazer a leitura dos dados a partir do arquivo. Perceba que ele está sendo definido para o scanner que vai a leitura.

O segundo locale é usado para fazer a formatação dos dados que vão ser impressos.

Na hora da leitura queremos ler os dados no formato americano com ponto no lugar da vírgula. Na hora de imprimir, queremos usar a vírgula como fazemos no padrão brasileiro.

Obrigado.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software