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)
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.
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.
[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 :?
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]