NullPointerException

Por que dá esse erro no código abaixo ?

[code]package exercicio5;

import javax.swing.JOptionPane;

public class Cavalo
{
private Cavalo[] cavalos = new Cavalo[3];
private String nome;
private float distancia_percorrida;
private char avatar;
private float distancia_atual;

public String getNome()
{
    return nome;
}
public void setNome(String nome2)
{
    nome = nome2;
}

public float getDistanciaPercorrida()
{
    return distancia_percorrida;
}
public void setDistanciaPercorrida(float distancia_percorrida2)
{
    distancia_percorrida = distancia_percorrida2;
}

public char getAvatar()
{
    return avatar;
}
public void setAvatar(char avatar2)
{
    avatar = avatar2;
}

public void Cavalo()
{
    try
    {
        for(int i=0;i<cavalos.length;i++)
        {
            cavalos[i].setNome(JOptionPane.showInputDialog("Digite o nome do cavalo "+(i+1))); // linha 46
            if(i==0)
                cavalos[i].setAvatar('B');
            else if(i==1)
                cavalos[i].setAvatar('P');
            else
                cavalos[i].setAvatar('M');
            cavalos[i].setDistanciaPercorrida(0);
        }
    }
    catch(NullPointerException e)
    {
        e.printStackTrace();
    }
}

public static void main(String[] args)
{
    Cavalo cavalos = new Cavalo();
    cavalos.Cavalo(); // linha 65
}

}[/code]

run:
java.lang.NullPointerException
at exercicio5.Cavalo.Cavalo(Cavalo.java:46)
at exercicio5.Cavalo.main(Cavalo.java:65)
CONSTRUÍDO COM SUCESSO (tempo total: 5 segundos)

tira esse .Cavalo(); ai da linha 65… entretando, o que vc quer fazer?

o metodo naum seria com letra minuscula?

em JAVA se usa CaSeSeNsItIvE, não esqueça!

Você instancio o array, porém falta instanciar os elementos do array.

Assim.

[code]
import javax.swing.JOptionPane;

public class Cavalo
{
private Cavalo[] cavalos = new Cavalo[3];
private String nome;
private float distancia_percorrida;
private char avatar;
private float distancia_atual;

public String getNome()
{
    return nome;
}
public void setNome(String nome2)
{
    nome = nome2;
}

public float getDistanciaPercorrida()
{
    return distancia_percorrida;
}
public void setDistanciaPercorrida(float distancia_percorrida2)
{
    distancia_percorrida = distancia_percorrida2;
}

public char getAvatar()
{
    return avatar;
}
public void setAvatar(char avatar2)
{
    avatar = avatar2;
}

public void Cavalo()
{
    try
    {
        for(int i=0;i<cavalos.length;i++)
        {
        	cavalos[i] = new Cavalo(); // Aqui instancia o Cavalo na Posição do array
            cavalos[i].setNome(JOptionPane.showInputDialog("Digite o nome do cavalo rá "+(i+1))); 
            if(i==0)
                cavalos[i].setAvatar('B');
            else if(i==1)
                cavalos[i].setAvatar('P');
            else
                cavalos[i].setAvatar('M');
            cavalos[i].setDistanciaPercorrida(0);
        }
    }
    catch(NullPointerException e)
    {
        e.printStackTrace();
    }
}

public static void main(String[] args)
{
    Cavalo cavalos = new Cavalo();
    cavalos.Cavalo(); // linha 65
}

}[/code]

Eu não posso tirar, porque essa é a chamada para o método construtor que faz o que o exercício quer. O que eu quero é executar o método construtor.

[quote]o metodo naum seria com letra minuscula?

em JAVA se usa CaSeSeNsItIvE, não esqueça![/quote]
O método construtor, se não me engano, é maiúsculo mesmo.

Onde você está carregando o seu array de cavalos? Por isso está dando NullPointer… O valor padrão para as posições de uma array é o valor padrão para o tipo de elemento armazenado. No seu caso Cavalo… logo o seu array de cavalos começa com todas as posicoes null.

Outra coisa… o nome do seu método ficou muito ruim… parece até um construturo… procure por outro nome e procure seguir o padrão camelCase.

Isso não é um construtor válido:

public void Cavalo()

Isso sim, é… Notou a diferença?

public Cavalo()

[]s

Valeu progoz, deu certo!

Você tem alergia a ovos? Você pode imaginar uma coisa assim: em Java, quando você cria uma caixa de ovos (ou seja, um array de ovos) essa caixa vem vazia, só com os espaços para você pôr os ovos. Você precisa criar os ovos separadamente. Então, para seu programa funcionar, você teria algo parecido com:

Ovo[] caixaDeOvos = new Ovo[12]; // isto você fez no seu programa...
for (int i = 0; i < caixaDeOvos.length; ++i) { // mas isto você não fez
    caixaDeOvos[i] = new Ovo();
}

Troque “Ovo” por “Cavalo” e seu programa irá funcionar.

esse Metódo Cavalo nunca foi um construtor por metódos construtores não tem tipo de retorno para ser um metódo construtor ficaria assim

public Cavalo() { try { for(int i=0;i<cavalos.length;i++) { cavalos[i] = new Cavalo(); cavalos[i].setNome(JOptionPane.showInputDialog("Digite o nome do cavalo rá "+(i+1))); // linha 46 if(i==0) cavalos[i].setAvatar('B'); else if(i==1) cavalos[i].setAvatar('P'); else cavalos[i].setAvatar('M'); cavalos[i].setDistanciaPercorrida(0); } } catch(NullPointerException e) { e.printStackTrace(); } }

e o main assim

public static void main(String[] args) { Cavalo cavalos = new Cavalo(); }

[quote]esse Metódo Cavalo nunca foi um construtor por metódos construtores não tem tipo de retorno para ser um metódo construtor ficaria assim

e o main assim[/quote]

Tentei fazer essas mudanças e olha como ficou o código:

[code]package exercicio5;

import javax.swing.JOptionPane;

public class Cavalo
{
private Cavalo[] cavalos = new Cavalo[3];
private String nome;
private float distancia_percorrida;
private char avatar;
private float distancia_atual;

public String getNome()
{
    return nome;
}
public void setNome(String nome2)
{
    nome = nome2;
}

public float getDistanciaPercorrida()
{
    return distancia_percorrida;
}
public void setDistanciaPercorrida(float distancia_percorrida2)
{
    distancia_percorrida = distancia_percorrida2;
}

public char getAvatar()
{
    return avatar;
}
public void setAvatar(char avatar2)
{
    avatar = avatar2;
}

public Cavalo()
{
    try
    {
        for(int i=0;i<cavalos.length;i++)
        {
            cavalos[i] = new Cavalo();
            cavalos[i].setNome(JOptionPane.showInputDialog("Digite o nome do cavalo "+(i+1)));
            if(i==0)
                cavalos[i].setAvatar('B');
            else if(i==1)
                cavalos[i].setAvatar('P');
            else
                cavalos[i].setAvatar('M');
            cavalos[i].setDistanciaPercorrida(0);
        }
    }
    catch(NullPointerException e)
    {
        e.printStackTrace();
    }
}

public static void main(String[] args)
{
    Cavalo cavalos = new Cavalo();
}

}[/code]
Mas deu uma porção de erros…

run:
Exception in thread “main” java.lang.StackOverflowError
at exercicio5.Cavalo.(Cavalo.java:46)
at exercicio5.Cavalo.(Cavalo.java:46)
at exercicio5.Cavalo.(Cavalo.java:46)
at exercicio5.Cavalo.(Cavalo.java:46)
at exercicio5.Cavalo.(Cavalo.java:46)
at exercicio5.Cavalo.(Cavalo.java:46)
at exercicio5.Cavalo.(Cavalo.java:46)
at exercicio5.Cavalo.(Cavalo.java:46)
at exercicio5.Cavalo.(Cavalo.java:46)
at exercicio5.Cavalo.(Cavalo.java:46)
at exercicio5.Cavalo.(Cavalo.java:46)
at exercicio5.Cavalo.(Cavalo.java:46)
at exercicio5.Cavalo.(Cavalo.java:46)
at exercicio5.Cavalo.(Cavalo.java:46)
at exercicio5.Cavalo.(Cavalo.java:46)
at exercicio5.Cavalo.(Cavalo.java:46)
at exercicio5.Cavalo.(Cavalo.java:46)
at exercicio5.Cavalo.(Cavalo.java:46)
at exercicio5.Cavalo.(Cavalo.java:46)
at exercicio5.Cavalo.(Cavalo.java:46)
at exercicio5.Cavalo.(Cavalo.java:46)
at exercicio5.Cavalo.(Cavalo.java:46)
… um milhão de vezes :?

Estou de memoria vc deve ter feito algum loop infinito!!

olhe com mais atenção o seu for, aparentemente esta correto!

Estourou a pilha porque dentro do construtor você ficou chamando o construtor…

procura fazer assim:

private Cavalo[] cavalos = new Cavalo[3];  //tira esse cara da classe cavalo

[code]public Cavalo( char avatar ){
this.setNome( JOptionPane.showInputDialog( "Digite o nome do cavalo " ) );
this.setAvatar( avatar );
this…setDistanciaPercorrida(0);
}

public static void main(String[] args) {
Cavalo[] cavalos = new Cavalos[ 3 ];
try{
for(int i=0;i<cavalos.length;i++){
if(i==0)
cavalos[i] = new Cavalo( ‘B’ );
else if(i==1)
cavalos[i] = new Cavalo( ‘P’ );
else
cavalos[i] = new Cavalo( ‘M’ );
}
}
catch(NullPointerException e)
{
e.printStackTrace();
}
} [/code]

Assim você vai conseguir fazer o mesmo que estava fazendo… de uma perspectiva um pouco diferente…

[]s>

Veja o que acontece. O que você quer fazer não pode está dentro do construtor, nessa linha

cavalos[i] = new Cavalo(); // Linha 44

Ele faz a chamada do construtor que é o começo do mesmo método que já esta em execução aí caí num loop infinito.
As alterações que tinha sugerido era a titulo de conhecimento. Você pode criar um novo método publico e invocar no main.

Algo do tipo.

[code]
public class Cavalo
{
private Cavalo[] cavalos = new Cavalo[3];
private String nome;
private float distancia_percorrida;
private char avatar;
private float distancia_atual;

public String getNome()
{
    return nome;
}
public void setNome(String nome2)
{
    nome = nome2;
}

public float getDistanciaPercorrida()
{
    return distancia_percorrida;
}
public void setDistanciaPercorrida(float distancia_percorrida2)
{
    distancia_percorrida = distancia_percorrida2;
}

public char getAvatar()
{
    return avatar;
}
public void setAvatar(char avatar2)
{
    avatar = avatar2;
}
public Cavalo(){}// Construtor

public void cadastrarCavalo() // Método que cadastra os Cavalos.
{
    try
    {
        for(int i=0;i<cavalos.length;i++)
        {
        	cavalos[i] = new Cavalo();
            cavalos[i].setNome(JOptionPane.showInputDialog("Digite o nome do cavalo rá "+(i+1))); // linha 46
            if(i==0)
                cavalos[i].setAvatar('B');
            else if(i==1)
                cavalos[i].setAvatar('P');
            else
                cavalos[i].setAvatar('M');
            cavalos[i].setDistanciaPercorrida(0);
        }
    }
    catch(NullPointerException e)
    {
        e.printStackTrace();
    }
}

public static void main(String[] args)
{
    Cavalo cavalos = new Cavalo();
    cavalos.cadastrarCavalo();
    
}[/code]