2013-11-20 45 views
0

我已经创建了自己的异常类型并希望在方法中实现它。到目前为止,我已经用以下方式编写了它,并且它可以工作。Java在方法中抛出异常的最佳方式

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; 
} 

我想知道什么或者这是否是做的最好的方式,如果有其他更合适/高效/正确的做这件事的方式。另外,我是否需要在方法头中声明异常?

在此先感谢。

+0

如果你只是在寻找一个雇员,那么你的方法应该返回'null'或'employee' *(如果找到)*,但它不应该抛出异常。 – Habib

+1

请将codereview.stackexchange.com用于此类问题,而不是StackOverflow。编写代码时,此站点存在问题。 –

+0

我认为你是异常看起来不错。对哈比来说,如果找不到员工是正常流量,那么你就不应该抛出异常。 –

回答

0

我不打算评论是否使用checked与unchecked exceptions,因为这会引发怪物辩论。

如果你创建一个检查的异常,那么是的,它必须抛出方法签名。如果您创建了未选中的例如从RuntimeException延伸,那么你不需要把它放在方法签名中。

检查异常通常是可以恢复的异常。 未经检查的异常无法恢复。

+0

你应该,做个标准的,只抛出'RuntimeException'就是程序在异常后不能继续。例如,'NullPointerException'是运行时,因为程序不知道如何处理它,但未能连接到URL并不是一个大问题,因为它可以绕过 - 如果需要连接,那么你可以定义程序必须自行停止。 – Obicere

0

如果您有其他一些信息而不是错误消息与异常一起发送出去。

您需要首先创建例外的对象

设定值要在异常

扔或者你可以写自己的构造函数,其将采取不同的价值观和异常消息异常创建要抛出的异常对象。

这样

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

是罚款

0

如果您实现Comparable和工人的compareTo方法如下您的代码会更有效 -

@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; 
} 

然后使用SortedSet收集类型(例如TreeSet<Worker>),特别是方法remove

你应该只是返回null。投掷Exception当然是您的选择,但(IMO)未检查Exception应保留为不可恢复的错误。

相关问题