??在開(kāi)發(fā)中,總會(huì)遇到各種好玩的事罐监,比如與H5交互的時(shí)候解析一個(gè)uri,比如前面剛發(fā)過(guò)的scheme的頁(yè)面跳轉(zhuǎn)——(如果看不可以百度一下什么是scheme頁(yè)面跳轉(zhuǎn)弓柱,說(shuō)有個(gè)url不合規(guī),但是沒(méi)說(shuō)明哪條矢空,已經(jīng)替換,但不敢確定能不能通過(guò))粥血。而在我滿(mǎn)心歡喜去調(diào)用的時(shí)候,卻直接崩潰了立莉,錯(cuò)誤信息就是——“This isn't a hierarchical URI.”,含義就是這個(gè)uri不合規(guī)蜓耻,天知道運(yùn)營(yíng)為什么會(huì)配出來(lái)這么個(gè)鬼東西讓我解析。但是boss說(shuō):“運(yùn)營(yíng)配錯(cuò)了刹淌,我去罵運(yùn)營(yíng),但是你崩潰了有勾,我就得來(lái)罵你古程!”
??仔細(xì)反應(yīng)了幾秒鐘,雖然我委屈挣磨,雖然我也很不服荤懂,但是boss你說(shuō)的真****有道理L猎摇!5羰摺!無(wú)奈女轿,怎么辦,解決唄谈喳!
找了一下代碼中報(bào)錯(cuò)的位置册烈,發(fā)現(xiàn)是:
val uri = intent.data
val text = uri.getQueryParameterNames("text")
??既然定位了婿禽,后面的事情就好辦了扭倾,直接去看看getQueryParameterNames中寫(xiě)的到底是個(gè)什么鬼東西就好了:
@Nullable
public String getQueryParameter(String key) {
if (isOpaque()) {
throw new UnsupportedOperationException(NOT_HIERARCHICAL);
}
if (key == null) {
throw new NullPointerException("key");
}
...
}
??可以看到其中有兩個(gè)throw 挽绩,也就意味著膛壹,我們可能會(huì)在兩種情況下崩潰唉堪,其中一種就是key為空,也不知道為毛知道不能為空唠亚,就不知道在參數(shù)前面加個(gè)@NonNull注解,這不是釣魚(yú)執(zhí)法灶搜,等著我們犯錯(cuò)誤嗎?
??好吧割卖,吐完槽了,來(lái)看我們這次崩潰遇到的問(wèn)題鹏溯。。丙挽。等等攻人,這也沒(méi)有This isn't a hierarchical URI啊悬槽,多虧看到一個(gè)不認(rèn)識(shí)的常量NOT_HIERARCHICAL怀吻,于是要多不情愿就有多不情愿的ctrl + 鼠標(biāo)左鍵點(diǎn)擊蓬坡,跳轉(zhuǎn)過(guò)去看看這孫子是誰(shuí)?
/**
* 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.";
??好吧磅叛,終于看到這個(gè)罪魁禍?zhǔn)滋崾菊Z(yǔ)了屑咳,上面的注釋翻譯過(guò)來(lái)就是:
??這個(gè)直譯我也是理解了好半天才反應(yīng)過(guò)來(lái),就是用戶(hù)解析的uri不正確的時(shí)候用來(lái)提示的錯(cuò)誤信息唄弊琴,還整什么as hierarchical兆龙。所以就可以看到,當(dāng)我們的uri不滿(mǎn)足isOpaque()條件時(shí)就會(huì)拋出這個(gè)異常敲董。那既然知道這個(gè)問(wèn)題了紫皇,也就好辦了,我們?cè)诮馕龅臅r(shí)候腋寨,只需要在前面加一層判斷聪铺,看uri是不是合規(guī)的格式不就可以了嗎:
val uri = intent.data
uri?.let{
if(!it.isOpaque()){
val text = it.getQueryParameterNames("text")
} else {
// 感謝運(yùn)營(yíng)大哥送的崩潰!L汛堋A逄蕖!
}
}
??別問(wèn)我為什么還要加個(gè)?.let查刻,鬼知道到底會(huì)不會(huì)配键兜,也不知道上游玩家是怎么操作的,有備無(wú)患吧穗泵,恭喜自己又撐過(guò)了一天普气!