在开发中,总会遇到各种好玩的事,比如与H5交互的时候解析一个uri,比如前面刚发过的scheme的页面跳转——(如果看不可以百度一下什么是scheme页面跳转,说有个url不合规,但是没说明哪条,已经替换,但不敢确定能不能通过)。而在我满心欢喜去调用的时候,却直接崩溃了,错误信息就是——“This isn't a hierarchical URI.”,含义就是这个uri不合规,天知道运营为什么会配出来这么个鬼东西让我解析。但是boss说:“运营配错了,我去骂运营,但是你崩溃了,我就得来骂你!”
仔细反应了几秒钟,虽然我委屈,虽然我也很不服,但是boss你说的真****有道理!!!!无奈,怎么办,解决呗!
找了一下代码中报错的位置,发现是:
val uri = intent.data
val text = uri.getQueryParameterNames("text")
既然定位了,后面的事情就好办了,直接去看看getQueryParameterNames中写的到底是个什么鬼东西就好了:
@Nullable
public String getQueryParameter(String key) {
if (isOpaque()) {
throw new UnsupportedOperationException(NOT_HIERARCHICAL);
}
if (key == null) {
throw new NullPointerException("key");
}
...
}
可以看到其中有两个throw ,也就意味着,我们可能会在两种情况下崩溃,其中一种就是key为空,也不知道为毛知道不能为空,就不知道在参数前面加个@NonNull注解,这不是钓鱼执法,等着我们犯错误吗?
好吧,吐完槽了,来看我们这次崩溃遇到的问题。。。等等,这也没有This isn't a hierarchical URI啊,多亏看到一个不认识的常量NOT_HIERARCHICAL,于是要多不情愿就有多不情愿的ctrl + 鼠标左键点击,跳转过去看看这孙子是谁?
/**
* Error message presented when a user tries to treat an opaque URI as
* hierarchical.
*/
private static final String NOT_HIERARCHICAL = "This isn't a hierarchical URI.";
好吧,终于看到这个罪魁祸首提示语了,上面的注释翻译过来就是:
这个直译我也是理解了好半天才反应过来,就是用户解析的uri不正确的时候用来提示的错误信息呗,还整什么as hierarchical。所以就可以看到,当我们的uri不满足isOpaque()条件时就会抛出这个异常。那既然知道这个问题了,也就好办了,我们在解析的时候,只需要在前面加一层判断,看uri是不是合规的格式不就可以了吗:
val uri = intent.data
uri?.let{
if(!it.isOpaque()){
val text = it.getQueryParameterNames("text")
} else {
// 感谢运营大哥送的崩溃!!!!
}
}
别问我为什么还要加个?.let,鬼知道到底会不会配,也不知道上游玩家是怎么操作的,有备无患吧,恭喜自己又撑过了一天!