【问题标题】:Bad practise to catch IllegalStateException? Alternatives?捕捉 IllegalStateException 的坏习惯?备择方案?
【发布时间】:2018-03-06 01:04:04
【问题描述】:

我正在构建一个处理保存的 Wi-Fi 信息的 Android 应用。我有一个返回 WifiEntry 对象的 ArrayList 的函数,但如果它无法访问 Wi-Fi 配置文件(例如,如果 root 访问不可用),它将返回 null。目前,我是这样处理的:

wifiEntries = try {
     WifiEntryLoader().readOreoFile()
} catch (e: IllegalStateException) {
     // Important irelevant stuff
     ArrayList()
}

我的问题是:有没有比捕获 IllegalStateException 更好的方法来处理 null 的可能性?我不想调用我的加载器函数两次。据我所知,我不能使用 Elvis 运算符来运行代码,除非我将它与 if 表达式一起使用(丑陋和 hacky)

【问题讨论】:

  • 哪个函数返回null,哪个函数准确抛出异常?
  • null 和 IllegalStateException 有什么关系?
  • @zsmb13 WifiEntryLoader().readOreoFile() 函数返回 null,@shmosel 将 null 分配给 wifiEntries ArrayList 会引发异常。

标签: null kotlin illegalstateexception convention


【解决方案1】:

根据评论中的详细说明,您应该只使用 Elvis 运算符和emptyList

wifiEntries = WifiEntryLoader().readOreoFile() ?: emptyList()

【讨论】:

  • 我在我的问题中提到了为什么我不能使用 Elvis 运算符。
  • 我仍然不明白为什么你不能 - 如果readOreoFile 返回null,你可以使用 Elvis 运算符为wifiEntries 分配一个空列表。您说“我不能使用 Elvis 运算符来运行代码,除非我将它与 if 表达式一起使用(丑陋和 hacky)”,但我不知道这是什么意思。
  • 我不只是分配一个空列表,我还调用了其他一些函数。我现在使用异常而不是返回 null,所以现在一切都很好。
【解决方案2】:

详细说明 zsmb13 的答案 - Kotlin 和 Java 有两个不同的运算符,它们看起来非常相似。 Java 有三元条件运算符,它基本上是内联 if-then-else 的简写符号。

// java
Integer test = nullable != null ? nullable : defaultValue;

Kotlin 的二进制“Elvis 运算符”允许您轻松定义默认值。如果左操作数为空,则返回右操作数。

// kotlin
val nullable: Any? = ...
val defaultValue: Any = ...

val test1: Any = if(nullable != null) nullable else defaultValue
// alternatively
val test2: Any = nullable ?: defaultValue

不过,通过返回一个空列表来处理您的情况似乎是不合适的。您应该考虑抛出异常,以便调用方法可以处理此错误,例如通过显示一个对话框,通知用户他可能缺少 root 权限。

【讨论】:

  • 我认为没有人将 Java 三元运算符称为 Elvis 运算符。
  • 其实我经常看到这个误称。感谢指出,调整答案。
  • 谢谢!我什至没有想过使用异常!我确实在我的问题中提到了为什么我不能使用 Elvis 运算符。由于我使用的代码是从其他人的应用程序中复制的,而不是从库中复制的,因此我很容易修复它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
  • 2018-07-28
  • 2010-10-16
相关资源
最近更新 更多