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

8 respostas Resolvido
H

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!

8 Respostas

I

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.

lvbarbosa

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.

H

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.

H

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.

staroski

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.

H

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

staroski
Solucao aceita

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

H

Entendi. Obrigado!

Criado 8 de dezembro de 2019
Ultima resposta 10 de dez. de 2019
Respostas 8
Participantes 4