Ajuda com Array

8 respostas
J

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!

8 Respostas

Vini_Fernandes

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

J

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 = 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

J

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)

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

Espero que goste...

J

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

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?

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:

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

Abraços e até mais!!

Criado 12 de julho de 2009
Ultima resposta 13 de jul. de 2009
Respostas 8
Participantes 4