mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-04-04 09:27:53 +08:00
Better error messages for ReadableNativeMap ClassCastExceptions
Reviewed By: mdvacca Differential Revision: D7800266 fbshipit-source-id: 3fa224d3adc54a7bc59a6a37b9ad6928ac33ceb6
This commit is contained in:
committed by
Facebook Github Bot
parent
0125813f21
commit
30d06b4286
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user