Skip to content

Commit 30d06b4

Browse files
ayc1facebook-github-bot
authored andcommittedMay 7, 2018
Better error messages for ReadableNativeMap ClassCastExceptions
Reviewed By: mdvacca Differential Revision: D7800266 fbshipit-source-id: 3fa224d3adc54a7bc59a6a37b9ad6928ac33ceb6
1 parent 0125813 commit 30d06b4

File tree

1 file changed

+28
-6
lines changed

1 file changed

+28
-6
lines changed
 

‎ReactAndroid/src/main/java/com/facebook/react/bridge/ReadableNativeMap.java

+28-6
Original file line numberDiff line numberDiff line change
@@ -121,20 +121,41 @@ private Object getValue(String name) {
121121
}
122122
throw new NoSuchKeyException(name);
123123
}
124+
125+
private <T> T getValue(String name, Class<T> type) {
126+
Object value = getValue(name);
127+
checkInstance(name, value, type);
128+
return (T) value;
129+
}
130+
124131
private @Nullable Object getNullableValue(String name) {
125132
if (hasKey(name)) {
126133
return getLocalMap().get(name);
127134
}
128135
throw new NoSuchKeyException(name);
129136
}
130137

138+
private @Nullable <T> T getNullableValue(String name, Class<T> type) {
139+
Object value = getNullableValue(name);
140+
checkInstance(name, value, type);
141+
return (T) value;
142+
}
143+
144+
private void checkInstance(String name, Object value, Class type) {
145+
if (value != null && !type.isInstance(value)) {
146+
throw new ClassCastException(
147+
"Value for " + name + " cannot be cast from " +
148+
value.getClass().getSimpleName() + " to " + type.getSimpleName());
149+
}
150+
}
151+
131152
@Override
132153
public boolean getBoolean(String name) {
133154
if (mUseNativeAccessor) {
134155
mJniCallCounter++;
135156
return getBooleanNative(name);
136157
}
137-
return ((Boolean) getValue(name)).booleanValue();
158+
return getValue(name, Boolean.class).booleanValue();
138159
}
139160
private native boolean getBooleanNative(String name);
140161

@@ -144,7 +165,7 @@ public double getDouble(String name) {
144165
mJniCallCounter++;
145166
return getDoubleNative(name);
146167
}
147-
return ((Double) getValue(name)).doubleValue();
168+
return getValue(name, Double.class).doubleValue();
148169
}
149170
private native double getDoubleNative(String name);
150171

@@ -154,8 +175,9 @@ public int getInt(String name) {
154175
mJniCallCounter++;
155176
return getIntNative(name);
156177
}
178+
157179
// All numbers coming out of native are doubles, so cast here then truncate
158-
return ((Double) getValue(name)).intValue();
180+
return getValue(name, Double.class).intValue();
159181
}
160182
private native int getIntNative(String name);
161183

@@ -165,7 +187,7 @@ public int getInt(String name) {
165187
mJniCallCounter++;
166188
return getStringNative(name);
167189
}
168-
return (String) getNullableValue(name);
190+
return getNullableValue(name, String.class);
169191
}
170192
private native String getStringNative(String name);
171193

@@ -175,7 +197,7 @@ public int getInt(String name) {
175197
mJniCallCounter++;
176198
return getArrayNative(name);
177199
}
178-
return (ReadableArray) getNullableValue(name);
200+
return getNullableValue(name, ReadableArray.class);
179201
}
180202
private native ReadableNativeArray getArrayNative(String name);
181203

@@ -185,7 +207,7 @@ public int getInt(String name) {
185207
mJniCallCounter++;
186208
return getMapNative(name);
187209
}
188-
return (ReadableNativeMap) getNullableValue(name);
210+
return getNullableValue(name, ReadableNativeMap.class);
189211
}
190212
private native ReadableNativeMap getMapNative(String name);
191213

0 commit comments

Comments
 (0)
Please sign in to comment.