Java 方法包含另一个抛出异常的方法

标签 java unchecked-exception

我有公共(public)方法 add(String) 调用私有(private)方法 inspectSequence(String) 来检查 String 是否有效。

如果传递的 String 有效,则此方法返回数组,如果无效,则方法抛出 IllegalArgumentException

接下来是代码

public void add(String sequence) throws IllegalArgumentException{
  inspectSequence(sequence);
}

private int[] inspectSequence(String sequence){
  int[] array;
  //some actions
  if(<some condition>) throw new IllegalArgumentException("description");
  return array;
}

所以在某些情况下,当将无效的 String 传递给 add 方法时,下一个输出将是:

java.lang.IllegalArgumentException: description
at inspectSequence
at add

但我不想让用户知道私有(private) inspectSequence 方法,因为这是实现细节,对吗?

那么在这种情况下我能做什么呢?在这里抛出未经检查的异常是个好主意吗?

inspectSequence 方法中抛出异常是个好主意,或者我应该在提供的 String 无效时返回 null 然后检查在 add 方法中返回结果并根据它抛出或不抛出异常?

最佳答案

But I don't want user to know about private inspectSequence method because this is realization detail, right?

我会说不。的确,您不希望用户(在该上下文中意味着调用代码的人)“知道”内部方法,例如 inspectSequence()。 “知道”是指能够调用、依赖等。

知道异常可能被抛出以及在什么情况下是调用者应该知道的事情,知道确切它被抛出的地方不是必需的,但不会'不会受伤。

当然,您可以在调用方法中捕获该异常并抛出另一个异常,但这只会丢失信息并可能使代码更难调试/维护,因为信息在哪里输入未被接受将丢失给调用者。

So what I can do in that case? Is it a good idea to throw unchecked exception here?

这取决于该异常是应该在运行时处理还是修复。

假设调用者需要知道序列无效并且应该适本地处理该信息,例如向最终用户显示一些信息。在这种情况下,最好抛出描述该情况的已检查异常。

另一方面,如果输入违反了方法的约定,即输入序列永远不应该是无效的(或者是编程错误),那么一个IllegalArgumentException 没问题 - 将 null 传递给不需要 null 参数的方法的情况。

And is a good idea to throw exception inside inspectSequence method or I should return null when supplied String isn't valid and then check returned result in add method and depending on it throw or not throw exception?

我会说不。返回 null 然后在调用方法中处理它在某些情况下可能是一种合理的方式(例如,如果您有不同的调用者以不同方式处理 null),但您的情况不是这些。这会使代码更复杂,因此更难阅读和维护,尤其是因为 null 可能具有多种含义,您必须在这种情况下定义这些含义。

关于Java 方法包含另一个抛出异常的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35556759/

相关文章:

java - 可以编辑已部署的 war /应用程序吗?

java - 如何在 Java 中编写未经检查的 Throwable

java-8 - Java 8 lambda 捕获异常

java - 是否可以从自身内部将 Object 设置为 null?

java - 如何使用java中的Scanner来计算输入.txt文件中以 ","分隔的单词数?

java - 无法在 weblogic、JMS、java 中设置 JMS_IBM_MQMD_MsgId 的属性值

java - 处理网络(URL、连接等)时要捕获哪些未经检查的异常?

java - JVM 如何处理 RuntimeException(s)

java - 很难理解已检查和未检查的异常

java - 自定义 View 无法正确绘制