Ajuda com Array

Pessoal,

Mais uma vez HELP!

Criar array de tipos primitivos eu consigo:

public class ArrayComum {

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.

Criei a classe abaixo:

public class Pessoa {

String nome;
String profissao;
int idade;

void mostraPessoa(){
	System.out.println("Nome: " + this.nome);
	System.out.println("Idade: " + this.idade );
	System.out.println("Identificação: " + this.profissao);
}

}

AGORA OLHA O TESTE:

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)

POR FAVOR ME AJUDEM MAIS ESTA VEZ!

Valeu!

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:

Object [] arr = new Object [2];
if(arr[0] == null)
   System.out.println("elemento nulo");

ate mais

Mas o problema é que o array está preenchido e continua falando que está null.

Cara, o que esta acontecendo eh o seguinte:

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"; 

ate mais

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.

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");
    }
}

}[/code]

Espero que goste…

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.

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

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?

void mostraPessoa(){ System.out.println("Nome: " + this.nome); System.out.println("Idade: " + this.idade ); System.out.println("Identificação: " + this.profissao); } }

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]   

Abraços e até mais!!