Android Bundle传入Float 0.0为何触发NullPointerException?
问题核心
这个空指针异常根本不是出在你存Bundle的代码里,而是接收页面用Safe Args取参数的时候。原因很明确:
- 你加判断跳过存值后,Bundle里压根没"priceModifier"这个键
- 但你在nav_graph里把该参数设成了非空类型,Safe Args生成的代码会强制从Bundle里拿这个值,拿不到就返回null,然后硬转成非空Float,直接触发NPE。
- 哪怕你存了0.0转的Float,也要确认接收方的取值逻辑,但大概率问题出在跳过存值的场景。
解决办法
分两种情况处理:
必须传这个参数(不管值是不是0.0)
删掉那个多余的判断,直接把参数存进Bundle就行。0.0是合法的非空值,存完接收方就能正常拿到:mBundle.apply { putFloat("priceModifier", mPriceModifier.toFloat()) } mNavController.navigate(R.id.action_global_processState, mBundle)这里放心,
mPriceModifier.toFloat()不会返回null,因为mPriceModifier是非空Double,转Float完全安全。业务允许参数为空
去nav_graph里把这个参数改成可空类型(勾选Nullable选项),然后接收方用可空Float类型接收,处理好null的情况就行。
额外要查的点
- 看看接收页面是不是用Safe Args生成的类取参数,别直接用
Bundle.getFloat()——后者没找到键会返回0.0f,不会抛异常,但Safe Args的非空参数就会炸。 - 确认mBundle是不是新创建的实例,有没有被其他代码改过导致参数丢失。
内容的提问来源于stack exchange,提问作者Spectator
相关产品推荐
相关产品推荐

