Java在方法中引发异常的最佳方法

Java在方法中引发异常的最佳方法,java,exception,methods,throw,Java,Exception,Methods,Throw,我已经创建了自己的异常类型,并希望在方法中实现它。到现在为止,我已经用下面的方式写了它,它是有效的 public Worker remove (String firstName, String lastName, String number) throws NoSuchEmployeeException { Worker w = null; for (int i = 0; i < list.size(); i++) { if (list.get(i).getFirstName().co

我已经创建了自己的异常类型,并希望在方法中实现它。到现在为止,我已经用下面的方式写了它,它是有效的

public Worker remove (String firstName, String lastName, String number) throws NoSuchEmployeeException {
Worker w = null;
for (int i = 0; i < list.size(); i++) {
  if (list.get(i).getFirstName().compareTo(firstName) == 0 &&
      list.get(i).getLastName().compareTo(lastName) == 0 &&
      list.get(i).getNumber().compareTo(number) == 0) {
    w = list.get(i);
    list.remove(i);
  }
  else
    throw new NoSuchEmployeeException(/*"Employee could not be found"*/);
}
return w;
}
public Worker remove(String firstName、String lastName、String number)抛出NoSuchEmployeeException{
Worker w=null;
对于(int i=0;i
我想知道的是,这是否是最好的方法,或者是否有其他更合适/有效/正确的方法。另外,我是否需要在方法头中声明异常


提前感谢。

我不打算评论是否使用检查与未检查异常,因为这将引发一场激烈的争论

如果创建一个选中的异常,则必须在方法签名中抛出它。如果您创建了一个未选中的扩展,例如从
RuntimeException
扩展,则不需要将其抛出方法签名中

检查异常通常是可恢复的异常。
未经检查的异常是不可恢复的。

如果您有错误消息以外的其他信息要与异常一起发送

您需要首先创建异常的对象

设置要在异常中抛出的值

或者您可以为异常编写自己的构造函数,该构造函数将采用不同的值和异常消息来创建要抛出的异常的对象

因此

throw new NoSuchEmployeeException(/*"Employee could not be found"*/);

很好

1如果您在Worker中实现并将
方法与
方法进行比较,您的代码将更加高效,如下所示-

@Override
public int compareTo(Object obj) {
  // identity.
  if (obj == this) {
    return 0;
  } else if (obj instanceof Worker) {
    Worker w = (Worker) obj;
    if (w.getNumber().compareTo(number) != 0) {
      return w.getNumber().compareTo(number);
    } else if (w.getLastName().compareTo(lastName) != 0) {
      return w.getLastName().compareTo(lastName);
    }
    return w.getFirstName().compareTo(firstName);
  }
  return -1;
}
然后使用集合类型(例如
TreeSet
),尤其是方法


2您可能应该返回null。抛出
异常
当然是您的选择,但是(在我看来)未经检查的
异常
应该保留为不可恢复的错误。

如果您只是在搜索员工,那么您的方法应该返回
null
员工
对象(如果找到),但它不应引发异常。请使用codereview.stackexchange.com处理此类问题,而不是StackOverflow。这个网站是为解决编写代码时出现的问题而设计的。我认为你很好。根据Habib的观点,如果找不到员工是正常的流程,那么你不应该抛出异常。另外,与列表上带有get(i)的for循环遍历列表不同,我会使用迭代器,然后你可以对其调用iterator.remove()。这是避免实现自定义异常的最佳实践,除非它们为客户机代码提供有用的信息。一般来说,重用现有异常。您应该按照标准,仅抛出
RuntimeException
,否则程序将无法在异常后继续。例如,
NullPointerException
是运行时的,因为程序不知道如何处理它,但无法连接到URL并不是一个大问题,因为它可以绕过-如果需要连接,那么您可以定义程序必须自行停止。