偷个懒:和大家共同探索下Intent.getxxxExtra()是否需要捕获异常
下面我们以getStringExtra为例,共同探索下:
private Bundle mExtras;
/**
* Retrieve extended data from the intent.
*
* @param name The name of the desired item.
*
* @return the value of an item previously added with putExtra(),
* or null if no String value was found.
*
* @see #putExtra(String, String)
*/
public @Nullable String getStringExtra(String name) {
return mExtras == null ? null : mExtras.getString(name);
}
Bundle中并没有实现getString方法,其中Bundle是继承BaseBundle的,我们去BaseBundle下看下
public final class Bundle extends BaseBundle implements Cloneable, Parcelable {
BaseBundle 的getString要求传入的key是非空的,实际上是非常有意义的,public的接口如果我们不控制入参@Nullable,
就需要在使用入参前,对入参进行非空判断,即使不可能为空,还是需要例行判空。因为没有人知道调用该接口的
是使用者还是恶意的攻击者。
言归正传,看unparcel()方法:
/**
* Returns the value associated with the given key, or null if
* no mapping of the desired type exists for the given key or a null
* value is explicitly associated with the key.
*
* @param key a String, or null
* @return a String value, or null
*/
@Nullable
public String getString(@Nullable String key) {
unparcel();
final Object o = mMap.get(key);
try {
return (String) o;
} catch (ClassCastException e) {
typeWarning(key, o