Problemas com classe Scanner

Olá comunidade, boa tarde.
Essa é minha segunda conta aqui, pois perdi a primeira e não consigo recuperar a senha.
Bem, faz muito tempo que posto aqui. Voltei a estudar Java depois de um longo tempo e me
deparei com um problema na classe Scanner. Estou estudando novamente pelo livro do Paul
Deitel. No capítulo sobre orientação a objetos resolvi criar meu próprio programa como exercício de aprendizagem.
No exemplo do livro ele passa parâmetros para a super classe escrevendo os dados na lista de parâmetros do objeto e os enviando para o método construtor da super classe. Porém, eu resolvi fazer isso utilizando a entrada de dados e usando a classe Scanner.
Bem, são três classes em meu projeto, a saber: Uma chamada Comissionados, outra VendedorBaseComissionado e outra FolhaPagmentoTeste. Essa última contêm o método main. Nesse método crio dois objetos, um para a classe Comissionados e outro para a classe VendedorComissionado. Uso a classe Scanner para fazer a entrada dos dados para os dois objetos e os passo para o método construtor de cada classe. A entrada de dados para o funcionário1 está funcionando, porém, quando faço a entrada de dados para o funcionário2 o compiador manda infrmar o nome do funcionario2, não pede seu nome e manda informar o cpf do funcionario2. Alguém sabe me dizer onde está o erro ou o que está acontecendo, por favor?
O código fonte da classe FolhaPagamentoTeste está abaixo:

package folhaPagamento;
import java.util.Scanner;

public class FolhaPagamentoTest
{

	public static void main(String[] args)
	{
		Scanner entrada = new Scanner(System.in);
		
		String nm;
		String cp;
		double venda;
		double com;
		double sal;
		
		// Entrada de dados do funcionário comissionado
		System.out.printf("%s\n", "Informe o nome do funcionário comissionado:");
		nm = entrada.nextLine();
		
		System.out.printf("%s\n", "Informe o cpf do fucnionário comissionado:");
		cp = entrada.nextLine();
		
		System.out.printf("%s\n", "Informe as vendas do funcionário comissionado:");
		venda = entrada.nextDouble();
		
		System.out.printf("%s\n", "informe a comissão do funcionário comissionado:");
		com = entrada.nextDouble();
		
		Comissionados funcionario1 = new Comissionados(nm, cp, venda, com);
		
		// Entrada de dados do funcionário comissionado com salário fixo
		System.out.printf("%s\n", "Informe o nome do funcionário com salário e comissão:");
		nm = entrada.nextLine();
			
		System.out.printf("%s\n","Informe o cpf do fucnionário com salário e comissão:");
		cp = entrada.nextLine();
		
		System.out.printf("%s\n", "Informe as vendas do funcionário com salário e comissão");
		venda = entrada.nextDouble();
		
		System.out.printf("%s\n", "Informe a comissão do funcionário com salário e comissão");
		com = entrada.nextDouble();
		
		System.out.printf("%s\n", "Informe o salário funcionário com salário e comissão");
		sal = entrada.nextDouble();
		
		VendedorBaseComissionado funcionario2 = new VendedorBaseComissionado(nm, cp, venda, com, sal);
		
		// Imprime na tela os dados do vendedor com comissão
		System.out.printf("\n%s\n: %s\n", "Dados do vendedor com comissão", funcionario1.toString());
		
		// Imprime na tela os dados do vendedor com comissão e salário:
		
		System.out.printf("\n%s\n %s\n", "Dados do vendedor com comissão e salário", funcionario2.toString());
	}
}

Esse é um velho problema do Scanner, inclusive já tem trocentos tópicos aqui no GUJ falando disso.

Resumindo, o problema é misturar nextLine com nextDouble. O ideal, ao ler a entrada do teclado, é usar nextLine e converter para o tipo desejado.

Ou seja, em vez de:

com = entrada.nextDouble();

Faça:

com = Double.parseDouble(entrada.nextLine());

Como é um exercício, é o suficiente, mas o ideal é tratar o erro, caso não seja digitado um número válido:

while (true) {
    System.out.printf("%s\n", "informe a comissão do funcionário comissionado:");
    try {
        com = Double.parseDouble(entrada.nextLine());
        break;
    } catch (NumberFormatException e) {
        System.out.println("Você não digitou um número válido, tente novamente");
    }
}

Ou seja, se não for digitado um número válido (por exemplo, digitou “xyz”), ele mostra uma mensagem de erro e pede que digite novamente.


Se quiser a explicação mais detalhada (para entender porque o problema acontece), tem aqui:

Olá Hugo, rapaz, muito obrigado pela ajuda.
Eu já havia resolvido esse problema hoje. Criei uma variável do tipo String chamada sujeira e coloquei a instrução:
sujeira = entrada.nextLine();
após a instrução:
Comissionados funcionario1 = new Comissionados(nm, cp, venda, com);

Fiz isso porque lembrei que em linguagem C quando utilizamos a função Scanf() para fazer uma entrada de dados do tipo String o compilador deixa uma sujeira (/n) no buffer e a próxima instrução Scanf() pegará essa sujeira ao invés do dado que queremos entrar.
Mas acho que sua dica faz o código ficar bem mais consistente e elegante. Nesse capítulo sobre orientação a objeto o autor ensina validar os dados, por exemplo, o salário não pode ser um número negativo, a comissão também não, e assim por diante. Mas mesmo assim acho que sua solução é uma boa prárica de programação melhor.
Valeu mesmo pela ajuda. Irei ler o lin que você deixou:
Obrigado aí.