public static void main(String[] args) {
String [] a = new String[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.
public class TestaPessoa {
public static void main(String[] args) {
Pessoa [] pessoas = new Pessoa[2];
pessoas[0].nome = "Joao";
pessoas[0].idade = 20;
pessoas[0].profissao = "Vendedor";
System.out.println(pessoas[0].nome);
System.out.println(pessoas[0].idade);
System.out.println(pessoas[0].profissao);
}
}
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:
Pessoa [] pessoas = new Pessoa[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 exception
pessoas[0].nome = "Joao";
pessoas[0].idade = 20;
pessoas[0].profissao = "Vendedor";
Veja o codigo corrigido:
Pessoa [] pessoas = {new Pessoa(), new Pessoa()};
pessoas[0].nome = "Joao";
pessoas[0].idade = 20;
pessoas[0].profissao = "Vendedor";
ou ainda se preferir
Pessoa [] pessoas = new Pessoa[2];
pessoas[0] = new Pessoa();
pessoas[0].nome = "Joao";
pessoas[0].idade = 20;
pessoas[0].profissao = "Vendedor";
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)
[code]public class Pessoa {
private String nome;
private String profissao;
private int idade;
//Construtor default
public Pessoa() {}
//Construtor com parâmetros
public Pessoa(String nome, String profissao, int idade) {
this.nome = nome;
this.profissao = profissao;
this.idade = idade;
}
public int getIdade() {
return idade;
}
public void setIdade(int idade) {
this.idade = idade;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getProfissao() {
return profissao;
}
public void setProfissao(String profissao) {
this.profissao = profissao;
}
@Override
public String toString() {
return "Nome: " + this.nome + "\nIdade " + this.idade + "\nProffissão: " + this.profissao;
}
}[/code]
[code]
public class TestaPessoa {
public static void main(String[] args) {
Pessoa[] pessoas = new Pessoa[2];
Pessoa pessoa1 = new Pessoa(); //Instanciando um objeto do tipo Pessoa com referência nula
//1ª forma: usando os métos set para preencher os atributos nome, profissao e idade
pessoa1.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 atributos
Pessoa pessoa2 = new Pessoa("Maria", "Vendedora", 25);
pessoas[0] = pessoa1;
pessoas[1] = pessoa2;
for (int i = 0; i < pessoas.length; i++) {
System.out.println(pessoas[i]+"\n");
}
}
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:
[code]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());
} [/code]