![](/img/trans.png)
[英]NullPointerException calling getIntent().getStringExtra(…)
[英]How is "(Integer)getIntent().getExtras().get(x)" different from "(Integer)getIntent().getStringExtra(x)"?
我试图从我创建的 Intent 中提取一个 int,但第二个抛出错误“无法将 java.lang.String 转换为 int”,而第一个则没有。 为什么会发生这种情况?
谢谢
要获得需要使用的int
值
getIntent().getIntExtra("x", 0)
或者
getIntent().getExtras().getInt("x")
第一个是:
(Integer)getIntent().getExtras().get(x)
这将根据键x
检索一个Object
并尝试将其转换为Integer
。 如果get()
返回其他内容,您将在运行时崩溃并ClassCastException
。
第二个是:
(Integer)getIntent().getStringExtra(x)
这将检索基于键x
的String
并尝试将其转换为Integer
。 Object
可能是Integer
,这就是为什么第一个编译但可能在运行时失败的原因。 String
不可能是Integer
。 因此,这在编译时失败。
正如 Oleg 先生所指出的,正确的答案是在Intent
上调用getIntExtra()
或在getExtras()
返回的Bundle
上调用getInt()
getExtras()
。
这都是关于铸造的。
getIntent().getExtras().get(x) 返回一个对象类型。
而 (Integer)getIntent().getStringExtra(x) 返回一个字符串类型的对象。
如果您还记得(或刚刚学习),默认情况下每个 Java Class
扩展 Object 并且会得到它的方法,例如toString()
。
这就是为什么您可以尝试将 Object 转换为任何类的原因。 尝试 - 但如果失败,您只会在运行时知道它。
另一方面, String
是一个已经扩展了Object
的类,与Integer
无关,它有自己的值和属性。
因此,当您尝试从String
转换为Integer
您会收到错误消息。
最佳解决方案已经发布。
我只想补充一点,你仍然可以这样做:
getInteger(getIntent().getStringExtra(x));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.