Duvida logica

Ola galera estou implementando uma classe main pra criar um objeto da classe Automovel a qual é herdade da classe Transporte…
O erro é o seguinte o programa começa a rodar entao ele pede pra mim inserir um numero com a opção escolhida eu escolho ‘1’ pra poder cadastrar um novo altomovel logo em seguida na hora que ele pede pra mim inserir a marca o compilador pula a parte de inserir os dados entao passa logo para o modelo…

Ai vai o codigo:

    public static void main(String[] args) {
        String marca;
        String modelo;
        int quilometragem;
        double capacidade;
        String placa;
        
        int aux;
        
        Scanner scan = new Scanner(System.in);
        
        do{
        System.out.print("1 - Cadastrar Automovel\n");
        System.out.print("2 - Cadastrar Aviao\n");
        System.out.print("3 - Automovel\n");
        System.out.print("4 - Aviao\n");
        System.out.print("5 - Sair\n");
        System.out.print(">>");
        aux = scan.nextInt();
        
        switch(aux){
        case 1: 
            System.out.print("Marca: ");
            marca = scan.nextLine();
            System.out.print("Modelo: ");
            modelo = scan.nextLine();
            System.out.print("Quilometragem: ");
            quilometragem = scan.nextInt();
            System.out.print("Capacidade tanque: ");
            capacidade = scan.nextDouble();
            System.out.print("Placa: ");
            placa = scan.nextLine();
            Automovel auto = new Automovel(marca, modelo, quilometragem, capacidade, placa);            
            break;
        case 2:
            break;
        }
        
        
        }while(aux!=5);
        
    }

Quando o codigo roda acontece isso:

run:
1 - Cadastrar Automovel
2 - Cadastrar Aviao
3 - Automovel
4 - Aviao
5 - Sair

1

Marca: Modelo:

Nao tem como eu digitar a marca e sim só o modelo…

Troque o método nextLine() pelo next().

Há uma certa diferença entre eles.

Recomendo que você de uma pesquisada sobre isso.

Abraço.

Olá.

Como o amigo acima disse, existe realmente uma diferença. Dê uma olhada na documentação!
O método nextLine() é descrito assim:

[quote]nextLine

public String nextLine()

Advances this scanner past the current line and returns the input that was skipped. This method returns the rest of the current line, excluding any line separator at the end. The position is set to the beginning of the next line.

Since this method continues to search through the input looking for a line separator, it may buffer all of the input searching for the line to skip if no line separators are present. [/quote]

E o nextInt assim:

[quote]nextInt

public int nextInt(int radix)

Scans the next token of the input as an int. This method will throw InputMismatchException if the next token cannot be translated into a valid int value as described below. If the translation is successful, the scanner advances past the input that matched.

If the next token matches the Integer regular expression defined above then the token is converted into an int value as if by removing all locale specific prefixes, group separators, and locale specific suffixes, then mapping non-ASCII digits into ASCII digits via Character.digit, prepending a negative sign (-) if the locale specific negative prefixes and suffixes were present, and passing the resulting string to Integer.parseInt with the specified radix. 

[/quote]

O que quer dizer? nextLine pega o ponto onde o scanner “parou” e segue até um caracter de final de linha (delimiter que por padrão é o caracter de nova linha). Os métodos nextInt e derivados procuram na linha corrente por um padrão que case com o que está sendo pedido (um inteiro? um double? um boolean?). Se vc começa por nextInt é encontrado o inteiro mas note que o scanner não terminou de pegar a linha toda! Ficou o restante (o pulo de linha) e então a primeira chamada a nextLine vai pegar esse “lixo”.

Então como vc resolve? Ou usa para tudo um nextLine e da um parse na entrada, por exemplo usando Integer.parseInt(scan.nextLine()), etc. Ou então usa somente métodos nextAlgumaCoisa (menos nextLine é claro).

Quer provar o que falei? Na hora que for fornecer o valor do menu (1 por exemplo) dê a seguinte entrada:
1 teste

E depois de pegar as entradas, mande exibir a variável marca (que parece que estã sendo “pulada”).
Você vai ver que var aparecer " teste", ou seja, o restante da linha (entre 1 e o caracter de nova linha).

Conseguiu entender?

[]´s

Agradecer aki ao Shaft e ao davidbuzatto …
Vo dar mais uma pesquisada a respeito do assunto…
Mais com as respostas ai deu pra resolver meu problema aki…

Abraço…