Better error messages for ReadableNativeMap ClassCastExceptions

Reviewed By: mdvacca

Differential Revision: D7800266

fbshipit-source-id: 3fa224d3adc54a7bc59a6a37b9ad6928ac33ceb6
This commit is contained in:
Andrew Chen (Eng)
2018-05-07 12:16:28 -07:00
committed by Facebook Github Bot
parent 0125813f21
commit 30d06b4286

View File

@@ -121,6 +121,13 @@ public class ReadableNativeMap extends NativeMap implements ReadableMap {
}
throw new NoSuchKeyException(name);
}
private <T> T getValue(String name, Class<T> type) {
Object value = getValue(name);
checkInstance(name, value, type);
return (T) value;
}
private @Nullable Object getNullableValue(String name) {
if (hasKey(name)) {
return getLocalMap().get(name);
@@ -128,13 +135,27 @@ public class ReadableNativeMap extends NativeMap implements ReadableMap {
throw new NoSuchKeyException(name);
}
private @Nullable <T> T getNullableValue(String name, Class<T> type) {
Object value = getNullableValue(name);
checkInstance(name, value, type);
return (T) value;
}
private void checkInstance(String name, Object value, Class type) {
if (value != null && !type.isInstance(value)) {
throw new ClassCastException(
"Value for " + name + " cannot be cast from " +
value.getClass().getSimpleName() + " to " + type.getSimpleName());
}
}
@Override
public boolean getBoolean(String name) {
if (mUseNativeAccessor) {
mJniCallCounter++;
return getBooleanNative(name);
}
return ((Boolean) getValue(name)).booleanValue();
return getValue(name, Boolean.class).booleanValue();
}
private native boolean getBooleanNative(String name);
@@ -144,7 +165,7 @@ public class ReadableNativeMap extends NativeMap implements ReadableMap {
mJniCallCounter++;
return getDoubleNative(name);
}
return ((Double) getValue(name)).doubleValue();
return getValue(name, Double.class).doubleValue();
}
private native double getDoubleNative(String name);
@@ -154,8 +175,9 @@ public class ReadableNativeMap extends NativeMap implements ReadableMap {
mJniCallCounter++;
return getIntNative(name);
}
// All numbers coming out of native are doubles, so cast here then truncate
return ((Double) getValue(name)).intValue();
return getValue(name, Double.class).intValue();
}
private native int getIntNative(String name);
@@ -165,7 +187,7 @@ public class ReadableNativeMap extends NativeMap implements ReadableMap {
mJniCallCounter++;
return getStringNative(name);
}
return (String) getNullableValue(name);
return getNullableValue(name, String.class);
}
private native String getStringNative(String name);
@@ -175,7 +197,7 @@ public class ReadableNativeMap extends NativeMap implements ReadableMap {
mJniCallCounter++;
return getArrayNative(name);
}
return (ReadableArray) getNullableValue(name);
return getNullableValue(name, ReadableArray.class);
}
private native ReadableNativeArray getArrayNative(String name);
@@ -185,7 +207,7 @@ public class ReadableNativeMap extends NativeMap implements ReadableMap {
mJniCallCounter++;
return getMapNative(name);
}
return (ReadableNativeMap) getNullableValue(name);
return getNullableValue(name, ReadableNativeMap.class);
}
private native ReadableNativeMap getMapNative(String name);