InputMismatchException ao receber um input do usuário

Olá a todos.

Estou recebendo o erro InputMismatchException ao tentar receber um Double do usuário. Também deixei como Float e o mesmo ocorreu. Eu procurei formas de resolver, mas continuo com o erro.
O código e o erro estão mais abaixo.

import java.util.Scanner;

public class SalarioLiquido {
    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);

        float salario;
        Double desconto_extra = 0.0;
        int qtd_desconto_extra;
        String nome, cargo;


        System.out.print("Nome: ");
        nome = input.nextLine();

        System.out.print("Cargo: ");
        cargo = input.nextLine();

        System.out.print("Quantidade de descontos extras: ");
        qtd_desconto_extra = input.nextInt();
        for (int contador=0; contador<=qtd_desconto_extra; contador++) {
            System.out.print("Valor do desconto em R$: ");
            desconto_extra = input.nextDouble();
            desconto_extra = desconto_extra + desconto_extra;
            System.out.println(desconto_extra);
        }
    }
}

Erro:

Nome: Ana
Cargo: Advogada
Quantidade de descontos extras: 3
Valor do desconto em R$: 8.50
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 SalarioLiquido.main(SalarioLiquido.java:24)

Process finished with exit code 1

Se alguém puder me ajudar a entender o porquê de estar ocorrendo, agradeço. Pois creio ter entendido que essa exceção é lançada ao receber um tipo de dado que não esperava, mas não encontro onde está o erro.

Entre com o valor decimal usando vírgula. Por padrão o Scanner vai processar o que entra usando o locale da máquina.

Se quiser forçar o ponto, configure o Scanner a usar o locale americano por exemplo. Algo como:

Scanner s = new Scanner( System.in );
s.useLocale( Locale.US );

Uma dica, para evitar problemas com o gerenciamento do buffer do Scanner, o que para os menos experientes vai parecer um “bug”, procure sempre fazer as leituras de dados usando o método nextLine() e convertendo a String para o tipo apropriado quando necessário.

qtd_desconto_extra = Integer.parseInt( input.nextLine() );
// aqui é com ponto a leitura, o Scanner não vai influenciar
// pois está processando linhas
desconto_extra = Double.parseDouble( input.nextLine() );
3 curtidas

Muito obrigada pela sua resposta, davidbuzatto!