Better null checks
This commit is contained in:
@@ -79,6 +79,12 @@ public class ContentParser{
|
||||
private Json parser = new Json(){
|
||||
@Override
|
||||
public <T> T readValue(Class<T> type, Class elementType, JsonValue jsonData, Class keyType){
|
||||
T t = internalRead(type, elementType, jsonData, keyType);
|
||||
if(t != null) checkNullFields(t);
|
||||
return t;
|
||||
}
|
||||
|
||||
private <T> T internalRead(Class<T> type, Class elementType, JsonValue jsonData, Class keyType){
|
||||
if(type != null){
|
||||
if(classParsers.containsKey(type)){
|
||||
try{
|
||||
@@ -295,7 +301,6 @@ public class ContentParser{
|
||||
c.sourceFile = file;
|
||||
c.mod = mod;
|
||||
}
|
||||
checkNulls(c);
|
||||
return c;
|
||||
}
|
||||
|
||||
@@ -351,35 +356,21 @@ public class ContentParser{
|
||||
|
||||
private Object fieldOpt(Class<?> type, JsonValue value){
|
||||
try{
|
||||
Object b = type.getField(value.asString()).get(null);
|
||||
if(b == null) return null;
|
||||
return b;
|
||||
return type.getField(value.asString()).get(null);
|
||||
}catch(Exception e){
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/** Checks all @NonNull fields in this object, recursively.
|
||||
* Throws an exception if any are null.*/
|
||||
private void checkNulls(Object object){
|
||||
checkNulls(object, new ObjectSet<>());
|
||||
}
|
||||
|
||||
private void checkNulls(Object object, ObjectSet<Object> checked){
|
||||
checked.add(object);
|
||||
private void checkNullFields(Object object){
|
||||
if(object instanceof Number || object instanceof String) return;
|
||||
|
||||
parser.getFields(object.getClass()).values().toArray().each(field -> {
|
||||
try{
|
||||
if(field.field.getType().isPrimitive()) return;
|
||||
|
||||
Object obj = field.field.get(object);
|
||||
if(field.field.isAnnotationPresent(NonNull.class) && field.field.get(object) == null){
|
||||
throw new RuntimeException("Field '" + field.field.getName() + "' in " + object.getClass().getSimpleName() + " is missing!");
|
||||
}
|
||||
|
||||
if(obj != null && !checked.contains(obj)){
|
||||
checkNulls(obj, checked);
|
||||
checked.add(obj);
|
||||
throw new RuntimeException("'" + field.field.getName() + "' in " + object.getClass().getSimpleName() + " is missing!");
|
||||
}
|
||||
}catch(Exception e){
|
||||
throw new RuntimeException(e);
|
||||
|
||||
@@ -3,6 +3,7 @@ package io.anuke.mindustry.world.consumers;
|
||||
import io.anuke.arc.collection.*;
|
||||
import io.anuke.arc.function.*;
|
||||
import io.anuke.arc.scene.ui.layout.*;
|
||||
import io.anuke.arc.util.ArcAnnotate.*;
|
||||
import io.anuke.mindustry.entities.type.*;
|
||||
import io.anuke.mindustry.game.*;
|
||||
import io.anuke.mindustry.type.*;
|
||||
@@ -14,7 +15,7 @@ import io.anuke.mindustry.world.meta.values.*;
|
||||
import static io.anuke.mindustry.Vars.*;
|
||||
|
||||
public class ConsumeItemFilter extends Consume{
|
||||
public final Predicate<Item> filter;
|
||||
public final @NonNull Predicate<Item> filter;
|
||||
|
||||
public ConsumeItemFilter(Predicate<Item> item){
|
||||
this.filter = item;
|
||||
|
||||
@@ -2,6 +2,7 @@ package io.anuke.mindustry.world.consumers;
|
||||
|
||||
import io.anuke.arc.collection.*;
|
||||
import io.anuke.arc.scene.ui.layout.*;
|
||||
import io.anuke.arc.util.ArcAnnotate.*;
|
||||
import io.anuke.mindustry.entities.type.*;
|
||||
import io.anuke.mindustry.game.*;
|
||||
import io.anuke.mindustry.type.*;
|
||||
@@ -10,7 +11,7 @@ import io.anuke.mindustry.world.*;
|
||||
import io.anuke.mindustry.world.meta.*;
|
||||
|
||||
public class ConsumeLiquid extends ConsumeLiquidBase{
|
||||
public final Liquid liquid;
|
||||
public final @NonNull Liquid liquid;
|
||||
|
||||
public ConsumeLiquid(Liquid liquid, float amount){
|
||||
super(amount);
|
||||
|
||||
Reference in New Issue
Block a user