Jump to content

Deixar correr...


Ivo Pereira
 Share

Recommended Posts

Ora bem, estou a fazer um simples programa que pergunta os dados ao utilizador, ele escreve e no fim apresenta-os todos.

O problema é que não me quer deixar que o user ponha a localidade..

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package javaapplication1;
import java.util.Scanner;
/**
*
* @author Ivo
*/

public class Main {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        System.out.print("|''''''''''''''''''''''''''''''''''''''''''''|\n");
        System.out.print("|-----------Powered by: Ivo Pereira----------|\n");
        System.out.print("|''''''''''''''''''''''''''''''''''''''''''''|\n");
        System.out.print("|                                            |\n");
        System.out.print("|              My first Java app             |\n");
        System.out.print("|            Made in Netbeans IDE            |\n");
        System.out.print("|____________________________________________|\n");
        System.out.print("Digite o seu nome: \n");
        String nome = s.nextLine();
        System.out.print("Digite a sua idade: \n");
        int idade = s.nextInt();
        System.out.print("Digita a sua localidade: \n");
        String localidade = s.nextLine();

        System.out.print("Nome: " + nome + "\nIdade: " + idade + " anos\nLocalidade: " + localidade);
    }

}

Cumps

Link to comment
Share on other sites

Essa classe usa uns métodos um pouco estranhos 🙂

Estranho no sentido em que não lêem o input e descartam o conteúdo do buffer ou mesmo permitem esvaziar o buffer de forma simples. O que  está a acontecer é que estão a ficar dados no buffer que não são lidos logo, sendo guardados para serem lidos mais tarde.

Vou tentar explicar melhor:

Quando invocas pela primeira vez o método nextLine() o que acontece é que o ponteiro do buffer avança até depois de um \n. Quando invocas o nextInt(), vai ser usada uma expressão regular para ler o valor introduzido, pelo que o scanner irá ler até que encontre algo que não é um dígito, neste caso vai ler até encontrar o \n que é introduzido quando carregas no enter depois de colocares os números e que está no fim da linha. Quando a seguir invocas novamente o método nextLine(), dado que este vai procurar um 1n e ficou um no buffer que não foi lido, o método encontra logo algo para ler, e devolve-te o que está antes do \n encontrado, como o que estava antes do \n eram os números que foram consumidos anteriormente, ele devolve-te uma string vazia.

Logo, está a fazer exactamente o que mandaste 😉

Se, por exemplo, experimentares colocar uma invocação ao método nextLine() imediatamente depois de leres o inteiro, vais ver que já te deixar ler a localidade.

Não costumo trabalhar com este tipo de classe e não conheço os seus métodos em profundidade por isso neste momento não posso ser grande ajuda.

Link to comment
Share on other sites

Essa classe usa uns métodos um pouco estranhos 🙂

Estranho no sentido em que não lêem o input e descartam o conteúdo do buffer ou mesmo permitem esvaziar o buffer de forma simples. O que  está a acontecer é que estão a ficar dados no buffer que não são lidos logo, sendo guardados para serem lidos mais tarde.

Vou tentar explicar melhor:

Quando invocas pela primeira vez o método nextLine() o que acontece é que o ponteiro do buffer avança até depois de um \n. Quando invocas o nextInt(), vai ser usada uma expressão regular para ler o valor introduzido, pelo que o scanner irá ler até que encontre algo que não é um dígito, neste caso vai ler até encontrar o \n que é introduzido quando carregas no enter depois de colocares os números e que está no fim da linha. Quando a seguir invocas novamente o método nextLine(), dado que este vai procurar um 1n e ficou um no buffer que não foi lido, o método encontra logo algo para ler, e devolve-te o que está antes do \n encontrado, como o que estava antes do \n eram os números que foram consumidos anteriormente, ele devolve-te uma string vazia.

Logo, está a fazer exactamente o que mandaste 😉

Se, por exemplo, experimentares colocar uma invocação ao método nextLine() imediatamente depois de leres o inteiro, vais ver que já te deixar ler a localidade.

Não costumo trabalhar com este tipo de classe e não conheço os seus métodos em profundidade por isso neste momento não posso ser grande ajuda.

Vou experimentar.

Então o que usas para ler dados de input?

Link to comment
Share on other sites

Não costumo fazer programas que sejam apenas de consola ou que leiam do standard input, isso era no tempo em que programava em C 🙂

Mas se tiver de ler dados, uso as classes para trabalhar streams mas não uso essas classes que supostamente são um utilitário. A classe Scanner, PrintWriter e PrintStream são classe de apoio à leitura e formatação de dados, a primeria serve para ler dados de streams dividindo-as em pequenos pedaços que possam ser traduzido individualmente, os chamados tokens, e usa muito expressões regulares para saber o que ler, as últimas duas são classes de apresentação.

Normalmente uso BufferedReader, BufferedWritter, BufferedInputStream, BufferedOutputStream, FileReader InputStream, OutputStream, FileWritter, enfim uso-as quase todas menos as que indiquei acima.

Nota que não digo que seja melhor ou pior, apenas que não uso essas classes de ajuda, nunca me habituei e nunca precisei da "ajuda" que elas davam.

Link to comment
Share on other sites

Nem por isso, existem alguns pormenores que não existem da mesma forma em VB, como o caso de layout managers, mas se usares o Netbeas, por omissão o designer está a usar Free Layout, o que é bastante bom e nem precisas perceber que ele lá está 😉

Se usares o designer é simples, se não usares o único problema é que precisas conhecer muitas classes e dá jeito saberes programar minimamente na plataforma 🙂

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.