<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Paulo Matheus</title>
    <description>The latest articles on Forem by Paulo Matheus (@paulomatheus).</description>
    <link>https://forem.com/paulomatheus</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F941748%2Fd1adbcaf-0fc7-43f2-9577-71e18c0e1f38.jpg</url>
      <title>Forem: Paulo Matheus</title>
      <link>https://forem.com/paulomatheus</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/paulomatheus"/>
    <language>en</language>
    <item>
      <title>Captura de dados antes de Captura de linha: "erro" e solução, em Java.</title>
      <dc:creator>Paulo Matheus</dc:creator>
      <pubDate>Thu, 31 Aug 2023 14:53:07 +0000</pubDate>
      <link>https://forem.com/paulomatheus/captura-de-dados-antes-de-captura-de-linha-erros-e-solucao-em-java-2o85</link>
      <guid>https://forem.com/paulomatheus/captura-de-dados-antes-de-captura-de-linha-erros-e-solucao-em-java-2o85</guid>
      <description>&lt;p&gt;Quando estamos utilizando a classe Scanner para leitura de dados, nos deparamos com uma situação que não é tão fácil compreender para quem está iniciando na linguagem de programação Java. Acontece que: quando é utilizado um método de captura de dados (&lt;em&gt;next(), nextInt(), nextFloat(), nextDouble(), nextShort(), nextLong(), nextBoolean(), nextChar(), nextBigdecimal(), nextBigInteger()&lt;/em&gt;) e depois é utilizado o método de captura de uma linha (&lt;em&gt;nextLine()&lt;/em&gt;), este último vai capturar a quebra de linha (\n) do método de captura de dados anteriormente utilizado, e não vai permitir a captura da linha do usuário. Calma que vou exemplificar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import java.util.Scanner;
public class ExemploScanner{
    public static void main(String[] args){
        //Criando as variáveis para captura dos dados, e armazenamento desses dados
        Scanner input = new Scanner(System.in);
        int number;
        String line;
        //Recebendo o número digitado pelo usuário
        number = input.nextInt();
        //Recebendo a linha (uma frase por exemplo) digitada pelo usuário
        line = input.nextLine();
        //Imprimindo as informações capturadas
        System.out.println(“numero: ” + number + “ frase: ” + line);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No exemplo acima vamos ler um inteiro e depois ler uma linha completa, após inserir o número (por exemplo o número 10) o programa já encerra e imprime:&lt;/p&gt;

&lt;p&gt;numero: 10 frase:&lt;/p&gt;

&lt;p&gt;Nossa variável “number” foi alimentada, entretanto nossa variável “line” não (será que não foi mesmo?). Porque?&lt;/p&gt;

&lt;p&gt;Bom, acontece que (como diz a própria documentação oficial da classe Scanner) o método &lt;em&gt;nextLine()&lt;/em&gt; vai retornar “a linha que foi pulada”, ou seja, o conteúdo da linha anterior antes da gente pulá-la (em outras palavras: Pressionar o ENTER). Mas, se o usuário não digitou nada na linha, como que ele encerrou (deduzindo que algo foi inserido)? Aí entra em jogo o nosso método anterior utilizado (no nosso exemplo: &lt;em&gt;nextInt()&lt;/em&gt;). Esse método vai capturar apenas o inteiro, e não a linha completa. Percebam que existe uma linha, e depois que o inteiro for consumido, continua existindo uma linha (que é pulada depois que o usuário inserir o inteiro e pressionar Enter). Então, essa linha que foi pulada é que vai ser atribuída para o &lt;em&gt;nextLine()&lt;/em&gt; depois que o usuário apertar Enter. Ou seja, ele consumiu uma linha que está em branco.&lt;/p&gt;

&lt;p&gt;O mesmo vale caso a gente utilize qualquer método “nextAlgumTipoDeDadoEspecífico” antes de um &lt;em&gt;nextLine()&lt;/em&gt;. Vamos utilizar no exemplo abaixo o método &lt;em&gt;next()&lt;/em&gt; para capturar uma palavra:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import java.util.Scanner;

public class ExemploScanner{

    public static void main(String[] args){

        //Criando as variáveis para captura dos dados, e armazenamento desses dados

        Scanner input = new Scanner(System.in);

        String word;

        String line;

        //Recebendo uma palavra do usuário

        word =input.next();

        //Recebendo a linha (uma frase por exemplo) digitada pelo usuário

        line = input.nextLine();

        //Imprimindo as informações capturadas

        System.out.println(“palavra: ” + word  + “ frase: ” + line);

    }

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após inserir a palavra (vamos supor que digitamos “Java”), da mesma forma que com o número, o programa encerra e já mostra:&lt;/p&gt;

&lt;p&gt;palavra: Java frase:&lt;/p&gt;

&lt;p&gt;Mas isso ocorre apenas se utilizarmos os métodos Scanner de captura de dados antes de usar o de captura de linha, se você utilizar primeiro a captura de linha e depois a de dados, isso não ocorre, pois a captura de linha vai (adivinhem) capturar a linha toda, e já a captura de dados não, vai capturar apenas o dado específico que corresponde a seu método.&lt;/p&gt;

&lt;p&gt;Apenas para confirmar o que foi dito, vamos inverter a ordem de captura dos dados, primeiro vamos capturar a linha depois o número:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import java.util.Scanner;

public class ExemploScanner{

    public static void main(String[] args){

        //Criando as variáveis para captura dos dados, e armazenamento desses dados

        Scanner input = new Scanner(System.in);

        int number;

        String line;

        //Recebendo a linha (uma frase por exemplo) digitada pelo usuário

        line = input.nextLine();

        //Recebendo o número digitado pelo usuário

        number = input.nextInt();

        //Imprimindo as informações capturadas

        System.out.println(“numero: ” + number  + “ frase: ” + line);

    }

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ao executar nosso arquivo vamos digitar “Hello World” na primeira linha, e o número 7 na segunda. Nossa saída será:&lt;/p&gt;

&lt;p&gt;numero: 7 frase: Hello World&lt;/p&gt;

&lt;p&gt;Percebam que a única alteração que fizemos foi mudar a ordem de captura das variáveis. Sempre que forem utilizados os métodos de captura de dados específicos da classe Scanner, será produzido a quebra de linha. E se for utilizado o &lt;em&gt;nextLine()&lt;/em&gt; após ele(s), ocorrerá esse problema. E então, como solucionar?&lt;/p&gt;

&lt;p&gt;Você pode pensar que para solucionar basta utilizar dois &lt;em&gt;nextLine()&lt;/em&gt;’s, um para capturar a quebra de linha e outro para capturar a frase do usuário. De fato vai solucionar, mas não é nem de longe a melhor forma.&lt;/p&gt;

&lt;p&gt;Com o passar do tempo como desenvolvedor, você vai perceber que existem as boas práticas que regem as linguagens de programação, e que vai existir algumas diferentes formas (corretas) de solucionar um problema. Vamos utilizar uma dessas formas para esse problema, que vai ser: tratar a entrada dos dados do usuário (receber tudo em String e para os casos de inteiros, vamos convertê-los).&lt;/p&gt;

&lt;p&gt;Para fazer isso, vamos utilizar nas entradas o método &lt;em&gt;nextLine()&lt;/em&gt; e utilizar o método &lt;em&gt;Integer.parseInt()&lt;/em&gt; no caso dos inteiros. E para ficar melhor o exemplo, vamos supor que queremos fazer um cálculo com o número inteiro, multiplicando-o por 10 (para haver uma necessidade de utilização do mesmo como número de fato):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import java.util.Scanner;

public class ExemploScanner{

    public static void main(String[] args){

        //Criando as variáveis para captura dos dados, e armazenamento desses dados

        Scanner input = new Scanner(System.in);

        int number;

        String line;

        //Recebendo o número digitado pelo usuário

        number = Integer.parseInt(input.nextLine());

        //Recebendo a linha (uma frase por exemplo) digitada pelo usuário

        line = input.nextLine();

        //Imprimindo as informações capturadas

        System.out.println(“numero: ” + (number * 10)  + “ frase: ” + line);

    }

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora foi! Dá pra ficar ainda melhor, tornando o programa mais resistente a entradas inválidas (verificando se o valor inserido é inteiro, se for, faz o cálculo, se não, retorna uma mensagem informando para o usuário inserir um valor válido). Fica de atividade para vocês. ;)&lt;/p&gt;

&lt;p&gt;Foi exemplificado com o &lt;em&gt;nextInt()&lt;/em&gt; e sua conversão específica, mas a lógica serve para cada tipo de dado e seu método &lt;em&gt;next&lt;/em&gt; correspondente. &lt;/p&gt;

&lt;p&gt;Por exemplo, para converter para float utiliza-se &lt;em&gt;Float.parseFloat()&lt;/em&gt;, para converter para Double: &lt;em&gt;Double.parseDouble&lt;/em&gt;, para booleano: &lt;em&gt;Boolean.parseBoolean&lt;/em&gt;…&lt;/p&gt;

&lt;p&gt;Espero que tenha ajudado, abraço a todos!&lt;/p&gt;

</description>
      <category>java</category>
      <category>backend</category>
      <category>data</category>
    </item>
  </channel>
</rss>
