【问题标题】:Validate function preconditions in android在android中验证函数先决条件
【发布时间】:2015-05-25 11:05:26
【问题描述】:

通常在编写公共方法时,我会进行一些错误检查,例如

public SomeResult processSomething (int i, List<String> items) {
   if( i < 0 ) {
      throw new IllegalArgumentException();
   }
  if(items == null) {
     throw new NullPointerException();
  }
etc
}

在 android 编程中,标准的方法是什么?我注意到,当一个片段崩溃时,模拟器会转到前一个片段,所以从向用户显示的行为来看,我猜它是可以的。但是处理异常/错误情况的最佳方法是什么?

【问题讨论】:

    标签: java android methods error-handling preconditions


    【解决方案1】:

    这里的最佳实践与 Java 世界其他地方的最佳实践非常相似:

    1. 方法的第一行通常专门用于检查方法参数的有效性。如果发生错误,该方法应尽快失败。

    验证参数时,如果测试失败,则会抛出 Exception。通常抛出的这些未检查异常之一:

    • IllegalArgumentException
    • NullPointerException
    • IllegalStateException

    这些都来自RuntimeException

    2.如果类中every方法的every对象参数需要为非null以避免抛出NullPointerException ,那么可以在通用类javadoc 中声明一次,而不是对每个方法都重复。

    参考资料:

    Preconditions, Postconditions, and Class Invariants.

    编辑:

    回答您关于“查看特定错误”的问题:虽然确实可以这样做,但其想法是Exception 表示代码中存在编程错误。因此,应允许应用程序崩溃,以便用户可以报告错误,从而开发人员从应用程序的 Play 商店帐户中获取错误日志。这样他就可以纠正这些错误的根源。这个过程应该一直持续到,假设应用程序完全没有错误。

    【讨论】:

    • 我会接受这一点,我也不清楚如何优雅地处理异常。我的意思是创建特定于错误的视图?
    • 老实说,当我的手机出现应用程序崩溃时,我不会发送报告。我不知道有谁真正做到了。那么最好是捕获异常并通过应用程序将报告发送到某个地方并且以某种方式优雅地发生错误而不是崩溃?我问是因为我是 android 新手,不确定是否有可能/可行的解决方案?
    • 我确实收到了来自 Play 商店应用程序的错误报告,虽然是的,但并不是每个人都会报告这些错误。他们实际上应该默认报告,但人们甚至认为是“侵犯隐私”......叹息。
    • 你当然可以创建一个View,它显示捕获每个抛出的Exception,我相信Java SE中存在类似的东西。我看到的唯一问题是您可能没有意识到某些异常的原因。我认为如果您让应用程序崩溃,迟早有人会向您指出错误:)
    【解决方案2】:

    现在我们可以使用Kotlin Preconditions.kt:

    data class User(val active: Boolean, val email: String?)
    
    class UserHelper (private val user: User) {
    
        fun mergeUsers(otherUser: User) {
            // To verify enclosing class state we use "check methods".
            // If check fails IllegalStateException will be thrown
            checkNotNull(user.email) { "user email is null" }
            check(user.active) { "user is not active" }
    
            // To verify argument we use "require methods".
            // If check fails IllegalArgumentException will be thrown
            requireNotNull(otherUser.email) { "otherUser email is null" }
            require(otherUser.active) { "otherUser is not active" }
    
            // All the preconditions has been meet, so we can merge users
            // ...
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多