publicstaticvoidmain(String[]args){String[]a=newString[3];// Array "a" foi criado e tem a capacidade de armazenar 3 Strings.a[0]="VERDE";// A posição do array "a" foi preenchida.a[1]="AZUL";// A posição do array "a" foi preenchida.a[2]="AMARELO";// A posição do array "a" foi preenchida.System.out.println("Array: "+a[0]+".");System.out.println("Array: "+a[1]+".");System.out.println("Array: "+a[2]+".");
SAIDA:
Array: VERDE.
Array: AZUL.
Array: AMARELO.
O PROBLEMA ACONTECE QUANDO O TIPO NÃO É PRIMITIVO, JÁ TENTEI TUDO.
SE PREENCHER CADA CAMPO DO ARRAY SAI O MESMO ERRO: Exception in thread “main” java.lang.NullPointerException at capitulo7.TestaPessoa.main(TestaPessoa.java:8)
Cara, o que ocorre eh o seguinte: um array de primitivos tem seus elemtntos inicializados com o seu valor padrao, no caso um array de int tem seu valores setados para 0 (zero), já um array de objetos tem seus elementos setados para null, por padrao do Java. Para ver o comportamento execute o trecho de codigo abaixo:
Mas o problema é que o array está preenchido e continua falando que está null.
Vini_Fernandes
Cara, o que esta acontecendo eh o seguinte:
Pessoa[]pessoas=newPessoa[2];//voce nao pode fazer a chamada aos atributos da objeto pessoa pois o objeto ainda nao existe, o valor dele eh null.//em outras palavras, pessoas[0] == null, sendo assim, o que vc esta fazendo eh usar um referencia NULA e por isso tem um mull pointer exceptionpessoas[0].nome="Joao";pessoas[0].idade=20;pessoas[0].profissao="Vendedor";
icarofariax: Já conheço o trabalho do profº Nietz???
Vini Fernandes
Só tenho uma coisa a dizer: VALEU!
Eu sempre esqueço que tem que instanciar o array.
Agora vou usar um “for” para mais brincadeiras.
Valeu pela ajuda!!!
Até mais.
d10g3n35
Jingo Sei que essa não era sua dúvida, mais vou uma sujestão pra melhorar seu código.
Primeiro na classe Pessoa é ideal que os atributos tenham o modificador de visibilidade (ou modificador de acesso) private para prover o encapsulamento.
Ao invés do método mostraPessoa() com esses System.out.println() você deve sobreesvrever o método toString de Object, o que permitirá que você possa reusar esse código em outras situações (Quando você sobreescre o toString você pode simplesmente mandar imprimir o objeto que ele saberá imprimir os atributos que você definiu)
publicclassPessoa{privateStringnome;privateStringprofissao;privateintidade;//Construtor defaultpublicPessoa(){}//Construtor com parâmetrospublicPessoa(Stringnome,Stringprofissao,intidade){this.nome=nome;this.profissao=profissao;this.idade=idade;}publicintgetIdade(){returnidade;}publicvoidsetIdade(intidade){this.idade=idade;}publicStringgetNome(){returnnome;}publicvoidsetNome(Stringnome){this.nome=nome;}publicStringgetProfissao(){returnprofissao;}publicvoidsetProfissao(Stringprofissao){this.profissao=profissao;}@OverridepublicStringtoString(){return"Nome: "+this.nome+"\nIdade "+this.idade+"\nProffissão: "+this.profissao;}}
publicclassTestaPessoa{publicstaticvoidmain(String[]args){Pessoa[]pessoas=newPessoa[2];Pessoapessoa1=newPessoa();//Instanciando um objeto do tipo Pessoa com referência nula//1ª forma: usando os métos set para preencher os atributos nome, profissao e idadepessoa1.setNome("João");pessoa1.setProfissao("Vendedor");pessoa1.setIdade(20);//2ª forma: usando o construtor com parâmetros para instânciar um objeto do tipo Pessoa//com os atributos nome, profissao e idade já preenchidos//como toString de Pessoa foi sobreesrito você só precisa mandar pro System.out.println o objeto Pessoa que ele saberá imprimir todos os atributosPessoapessoa2=newPessoa("Maria","Vendedora",25);pessoas[0]=pessoa1;pessoas[1]=pessoa2;for(inti=0;i<pessoas.length;i++){System.out.println(pessoas[i]+"\n");}}}
Espero que goste...
J
Jingo
d10g3n35
Excelente sugestão não havia pensado nisso.
Eu sempre uso esse método (mostraXYZ ()) que é bem manual quando estou tentando criar algo.
Não sabia dessa opção de reescrever o toString, valeu!
Até mais.
T
Tecno-Java
Desculpe a pergunta tola mas qual a diferença? E o que voce quer dizer que isto permitira que possa reusar o codigo em outras situações?
Abraços
d10g3n35
Tecno-Java , o método toString está definido na classe pai Object. Sendo assim todo objeto tem ele por herança e
pode-se sobreescrever esse método dependendo de suas necessidades.
Ele serve para retornar um valor significativo do objeto em formato String para apresentação.
A forma como esse método abaixo foi implementado mostrará os valores na saída padrão de sua IDE.
Agora imagine se você precisase refatorar esse código para usar tipo uma interface gráfica (Digamos você tivesse um display).
Esse método tornaria-se inútil, certo?
Agora imagine se você tivesse sobreescito o toString(), poderia fazer simplesmente algo do tipo abaixo, sem ter que alterar a parte lógica simplesmente o modo de exibição:
Pessoa pessoa = new Pessoa("d10g3n35", "Estudante", 19);
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
//setando uma representação de um objeto em formato de String em um jTextArea (Imagine que isso poderia ser um tipo de Display,
//só pra exemplificações)
jTextArea.setText(pessoa.toString());
}