Olá
Estou com problema em um método do qual diz se uma variável genérica é null ou não retornando um boolean. Uma parte do meu código abaixo:
protected T var;
public boolean isEmpty() {
if (this.var == null) {
return true;
} else{
return false;
}
}
Ele está em uma hierarquia, esse método tá na principal, eu testo e passa de boa, mas quando vou usar em uma classe que extends essa dai não funciona.
public SerVivo(T var) {
this.var = var;
}
.
public class Animal<T> extends SerVivo<T>{
}
public Animal(T var) {
super(var);
}
Muitos outro métodos dependem dele, meu programa todo não tá funcionando. Criei o teste e o problema é sempre ele, java.lang.NullPointerException.
Acabei tirando nota baixa no projeto passado por causo do mesmo problema, não sei mais o que eu faço.
Posta o código completo de suas classes e do teste que você implementou.
1 curtida
public class SerVivo<T> {
protected T var;
public SerVivo(){
}
public SerVivo(T var) {
this.var = var;
}
public boolean isEmpty() {
return this.var == null;
}
public void inserir(T element) {
if (element != null && !this.isEmpty()) {
this.var = element;
}
}
public T getData() {
return var;
}
public void setData(T data) {
this.var = data;
}
}
public class Animal<T> extends SerVivo<T> {
protected int codigo;
public Animal(){
}
public Animal(T classe) {
super(classe);
}
public void inserirCodigo(int codigo) {
if (!this.isEmpty()) {
this.codigo = codigo;
}
}
public int getCodigo() {
return codigo;
}
}
@Test
public void testIsEmpty() {
primeiro = new Animal<Integer>();
segundo = new Animal<Integer>();
primeiro.inserir(5);
Assert.assertFalse(primeiro.isEmpty());
Assert.assertTrue(segundo.isEmpty());
}
O construtor padrão necessita de mais atenção do que o personalizado pois implica na necessidade de trabalhar com valores nulos.
Vide codificação semelhante:
//classe SerVivo
import javax.swing.JOptionPane;
public abstract class SerVivo<T> {
private T tipo;
public SerVivo() {
}
protected SerVivo(T tipo) throws NullPointerException {
if (tipo == null) {
throw new NullPointerException("O construtor utilizado não aceita null como parâmetro");
}
this.tipo = tipo;
}
public T getTipo() {
return tipo;
}
protected void setTipo(T tipo) {
if (isTipado()) {
mensagem("Animal já tipificado: " + this.tipo + " [" + this.tipo.getClass().getSimpleName()
+ "], a operação cancelada\n");
return;
}
this.tipo = tipo;
}
protected boolean isTipado() {
return tipo != null;
}
void mensagem(String msg) {
JOptionPane.showMessageDialog(null, msg);
}
}
//classe Animal
public class Animal<T> extends SerVivo<T> {
protected int codigo = Integer.MAX_VALUE;
public Animal() {
}
public Animal(T classe, int codigo) {
super(classe);
this.codigo = codigo;
}
public void setCodigo(int codigo) {
if (!isTipado()) {
mensagem("Necessário tipificar o animal antes de codificar");
}else{
if (this.codigo != Integer.MAX_VALUE) {
mensagem("Animal já codificado "+this.codigo);
}else{
this.codigo = codigo;
mensagem("Codificação realizada ["+codigo+"] para "+getTipo()+" ["+getTipo().getClass().getSimpleName()+"]");
}
}
}
public int getCodigo() {
return codigo;
}
}
//classe de teste
public class Crisis {
public static void main(String[] args) {
testes();
}
public static void testes() {
SerVivo<String> primeiro;
SerVivo<Integer> segundo;
SerVivo<Animal> animal1;
primeiro = new Animal<>("Urso", 25);
segundo = new Animal<>(14, 100);
animal1 = new Animal<>();
animal1.mensagem(animal1.getTipo()+ (animal1.isTipado() ? " Sim foi tipado" : " Aguardando tipar"));
animal1.setTipo(new Animal());
animal1.mensagem(animal1.getTipo()+(animal1.isTipado() ? " Sim foi tipado" : " Aguardando tipar " + animal1.getTipo().getClass()));
primeiro.setTipo("Troll");
segundo.setTipo(54);
((Animal) animal1).setCodigo(43);
Animal<ArrayList<Animal>> relva = new Animal();
System.out.println(relva.getTipo());
relva.setTipo(new ArrayList<>());
System.out.println(relva.isTipado()+" "+relva.getTipo().getClass().getSimpleName());
}
}