捕获IllegalStateException的不良做法?备择方案?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了捕获IllegalStateException的不良做法?备择方案?相关的知识,希望对你有一定的参考价值。
我正在构建一个处理已保存的Wi-Fi信息的android应用。我有一个返回WifiEntry对象的ArrayList的函数,但如果它无法访问Wi-Fi配置文件(例如,如果root访问不可用),则返回null。目前,我正在处理它:
wifiEntries = try {
WifiEntryLoader().readOreoFile()
} catch (e: IllegalStateException) {
// Important irelevant stuff
ArrayList()
}
我的问题是:是否有一种“更好”的方法来处理null的可能性而不是捕获IllegalStateException?我不想两次调用我的加载器功能。据我所知,我不能使用Elvis运算符来运行代码,除非我使用if表达式(丑陋和hacky)
基于评论中的详细说明,看起来您应该只使用Elvis运算符和emptyList
:
wifiEntries = WifiEntryLoader().readOreoFile() ?: emptyList()
为了详细说明zsmb13的答案--Kotlin和Java有两个不同的运算符,看起来非常相似。 Java有三元条件运算符,它基本上是内联if-then-else的简写符号。
// java
Integer test = nullable != null ? nullable : defaultValue;
Kotlin的二进制“Elvis运算符”允许您轻松定义默认值。如果左操作数为null,则返回右操作数。
// kotlin
val nullable: Any? = ...
val defaultValue: Any = ...
val test1: Any = if(nullable != null) nullable else defaultValue
// alternatively
val test2: Any = nullable ?: defaultValue
但是,通过返回空列表来处理您的情况似乎是不合适的。您应该考虑抛出异常,以便调用方法可以处理此错误,例如通过显示一个对话框通知用户他可能缺少root权限。
以上是关于捕获IllegalStateException的不良做法?备择方案?的主要内容,如果未能解决你的问题,请参考以下文章
终结器 java.lang.IllegalStateException 引发的未捕获异常:Binder 已终结
FragmentManager 上的 IllegalStateException
android--MediaRecorder.stop()报错java.lang.IllegalStateException
android--MediaRecorder.stop()报错java.lang.IllegalStateException
android--MediaRecorder.stop()报错java.lang.IllegalStateException