Better null checks

This commit is contained in:
Anuken
2019-10-14 18:40:28 -04:00
parent 3ffa768cfc
commit 3d8547d7dd
3 changed files with 14 additions and 21 deletions

View File

@@ -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);

View File

@@ -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;

View File

@@ -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);