Valores válidos para variáveis em Java

Durante o meu treinamento para certificação da Oracle surgiu o seguinte problema:

Quais são os valores válidos para uma variável do tipo int?
Imagine que temos a classe telefone:

public class Telefone {

     private final int ddd;
     private final long numero;

     public Telefone(int ddd, long numero) {
          this.ddd = ddd;
          this.numero = numero;
     }

     //métodos

}

Ótimo, agora vou cadastrar um telefone de São Paulo (SP):

public static void main (String[] args){     
     Telefone telSP = new Telefone(011, 33229000);
}

vou adicionar mais 2 telefones, um de Salvador(BA) e outro de Refice(PE):

Telefone telSP = new Telefone(011, 33229000);
Telefone telBA = new Telefone(071, 55339000);
Telefone telPE = new Telefone(081, 22669000);

Ué, o telefone de Recife não compila? Como assim? Deixa eu imprimir o telSP e o telBA:

Telefone telSP = new Telefone(011, 33229000);
Telefone telBA = new Telefone(071, 55339000);
System.out.println(telSP);
System.out.println(telBA);

Resultado:

> (9) 33229000
  (57) 55339000

9? 57?
Como assim?! Que estranho.
A variável do tipo int, além de receber inteiros, aceita números octais, hexadecimais e até mesmo binários!

Nesse caso, quando utilizamos o 0 na frente do número, indicamos que estamos lidando com números na base 8, ou seja: estrutura de números entre 1, 2, 3, 4, 5, 6 e 7, por isso os valores foram 9 e 57.
Isso também explica o motivo de não compilar o código de Recife(081), já que em octal, não existe o número 8 ou 9.
Então se tentarmos compilar um telefone de Campinas(SP):

//9 não faz parte dos números octais
int ddd = 019;

Não compila também! Para resolver esse caso, bastaria retirar o 0 em cada um dos ddds:

Telefone telSP = new Telefone(11, 33229000);
Telefone telBA = new Telefone(71, 55339000);
Telefone telPE = new Telefone(81, 22669000);
System.out.println(telSP);
System.out.println(telBA);
System.out.println(telPE);

Verificando o resultado:

> (11) 33229000
  (71) 55339000
  (81) 22669000

Agora o meu sistema cadastra os telefones conforme o esperado!

Vimos que nem sempre os valores que esperamos dar certo funcionam e por isso é importante compreender todas as restrições que as nossas variáveis possuem. Ficou curioso a respeito de outros valores interessantes que a variável int e as demais podem receber? Dê uma olhada nos nossos cursos de Java.


Content Editor at Alura and Software Developer

  • Muito interessante. Ótimo post! Parabéns 😉

    • Que bom que você gostou Bruno! Obrigado pelo comentário! 🙂

  • André Franco

    Olá Alex.

    Gostei do post, achei bem bcn. Porém neste caso eu, por default, já teria colocado os numeros como String justamente pra gravar com o zero na frente.

    • Olá André, tudo bem?

      Obrigado pelo comentário! Fico contente que tenha gostado!

      De fato é a abordagem mais adequada para essa situação, pois garante a informação do zero, porém, o intuito do post é justamente abordar uma situação que pode aparecer em uma certificação Java e então, podemos cair na armadilha da prova se não nos atentarmos! 🙂

      • André Franco

        Entendi.
        Não fazia ideia destes números octais. Já fico mais atento a isso.

  • Edson

    Interessante. Obrigado pela dica. Parabéns!

    • Que bom que você gostou Edson! Obrigado pelo comentário 🙂

  • Ian Pedro

    “Resultado:
    > (9) 33229000
    (57) 55339000
    9? 57?
    Como assim?! Que estranho.”

    Olá, gostaria de perguntar: Se nos números octais não existe o 9, como ele foi resultado?

    • Olá Ian, tudo bem?

      É uma boa pergunta, o que acontece é o seguinte:

      Quando estamos utilizando números octais nós não conseguimos representar números utilizando algorismos 8 ou 9, ou seja, podemos utilizar algarismo de 0 a 7. Se podemos apenas utilizar de 0 a 7, como poderíamos representar o número 8 e 9 no octal? É simples, ignoramos os algarismos 8 e 9 e continuamos a nossa contagem! Vamos simular uma contagem de 0 a 20 em octal:

      octal | decimal

      0 = 0
      1 = 1

      7 = 7
      ignoramos o 8
      ignoramos o 9
      10 = 8
      11 = 9

      17 = 15
      ignoramos o 18
      ignoramos o 19
      20 = 16
      21 = 17
      22 = 18
      23 = 19
      24 = 20

      E assim sucessivamente… Por isso que, se olharmos um pouco acima vemos o seguinte trecho de código:

      Telefone telSP = new Telefone(011, 33229000);
      Telefone telBA = new Telefone(071, 55339000);
      System.out.println(telSP);
      System.out.println(telBA);
      

      Perceba que estamos utilizando o número octal 11 que é 9, ou seja, o resultado será 9:

      > (9) 33229000
        (57) 55339000
      

      Obrigado pelo comentário 🙂

      • Ian Pedro

        Opa, obrigado a você! Mais um pouco de conhecimento adquirido por aqui 🙂

Próximo ArtigoFuncionalidade: sugestão de edição de conteúdo no Alura