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