Dúvida sobre exception - Porque NÃO ocorreu a 'nullpointerexception'?

Boa noite.

Estou analisando um pequeno código que foi criado para gerar a exceção ‘arrayindexoutofbundsexception’ ao tentar executar o código.

Segue o código:

class A{
    public static void main(String[] args){
        System.out.print(args); //A
        System.out.print(args.length); //B
        System.out.print(args[0]); //C
    }
}

Conforme previsto, ao tentar executar esse código a exception da linha C é gerada. A exception ocorre porque eu executo sem passar parâmetros para o método main. Dessa forma args está vazia. logo não é possível exibir o elemento [0] de args (ele nem existe).

Porém eu achava que iria gerar o ‘nullpointerexception’ na linha B. Uma vez que eu tento acessar uma propriedade de uma array que não foi inicializada ainda. Porém essa exception não ocorre.

Gostaria de entender porque.

Obrigado!

Boa pergunta. Na verdade args existe e tem tamanho zero (array vazio), já que uma string em Java é um objeto que não precisa ser instanciado (objeto imutável), conforme a documentação Docs Oracle - String. Não encontrei nada muito explícito sobre o assunto, mas o entendimento a que cheguei foi esse.

O array args tem tamanho 0 se você não passar nenhum argumento. Você está tentando acessar uma posição que não existe, a 0. Essa posição só existiria se o array tivesse um tamanho maior ou igual a 1. Quando você tenta acessar uma posição que não existe, uma ArrayIndexOutOfBoundsException acontece.

NullPointerException ocorre quando você tenta acessar um membro de uma referência nula. Não é o que está acontecendo nesse caso.

Mas pelo que eu li o nullpointerexception ocorre quando tentamos acessar um objeto que não foi instanciado ou inicializado.

A array args é definida na assinatura do método main. Porém, ao meu ver, só seria inicializada se eu passasse algum parâmetro.

Aí como não passei nada achei que daria exception pela linha B antes de chegar no exception da linha C.

Não sabia dessa. Vou pesquisar.

Então o objeto existe. Porém não é inicializado.

O que me gera dúvidas é que fiquei com a impressão de que o objeto deveria existir E ser inicializado antes de ser chamado.

E no caso desse código a inicialização só ocorreria mediante a passagem de parâmetro pro método main.

Esse é o método main logo o parâmetro args vai conter os parâmetros que você passou em linha de comando.
Se não passou nada, a JVM passa um array vazio.

1 curtida

Eu achei que quando tentasse acessar a .length de um array vazio receberia o erro.

Não, um array vazio tem length == 0.
Ocorreria exceção se você tentasse acessar o length de um array null.

2 curtidas

Entendi. Obrigado!