From 3d8547d7dd7e40cf2a07bce95b0f7e35327210eb Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 14 Oct 2019 18:40:28 -0400 Subject: [PATCH] Better null checks --- .../io/anuke/mindustry/mod/ContentParser.java | 29 +++++++------------ .../world/consumers/ConsumeItemFilter.java | 3 +- .../world/consumers/ConsumeLiquid.java | 3 +- 3 files changed, 14 insertions(+), 21 deletions(-) diff --git a/core/src/io/anuke/mindustry/mod/ContentParser.java b/core/src/io/anuke/mindustry/mod/ContentParser.java index 0e1c729b60..d49dfec7dd 100644 --- a/core/src/io/anuke/mindustry/mod/ContentParser.java +++ b/core/src/io/anuke/mindustry/mod/ContentParser.java @@ -79,6 +79,12 @@ public class ContentParser{ private Json parser = new Json(){ @Override public T readValue(Class type, Class elementType, JsonValue jsonData, Class keyType){ + T t = internalRead(type, elementType, jsonData, keyType); + if(t != null) checkNullFields(t); + return t; + } + + private T internalRead(Class 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 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); diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java index 417148dd72..57133c66ea 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java @@ -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 filter; + public final @NonNull Predicate filter; public ConsumeItemFilter(Predicate item){ this.filter = item; diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java index 066fb29836..2774849cb5 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java @@ -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);