Android知识点-Uri解析异常——This isn‘t a hierarchical URI.

博客讲述了在Android开发过程中遇到的一个问题,即由于URI不合规导致应用崩溃。作者通过代码分析发现,当尝试解析一个不合规的非层次URI时,会触发错误。解决方案是在解析前先检查URI是否符合规范,避免直接调用可能导致崩溃的方法。同时,作者吐槽了API设计的不合理性和运营配置错误带来的困扰。
摘要由CSDN通过智能技术生成

  在开发中,总会遇到各种好玩的事,比如与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,鬼知道到底会不会配,也不知道上游玩家是怎么操作的,有备无患吧,恭喜自己又撑过了一天!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值