最近,我接受了公司的采访,他们给了我一个编码问题。我得到了与卡片组相关的程序,其中一种方法是洗牌。所以我把程序写成:
/** Shuffle the list of cards so that they are in random order
* @param d Deck of cards*/
public static void shuffle(Deck d)
{
if(d == null)
throw new IllegalArgumentException();
Random randomGenerator = new Random();
List<Card> cards = d.getDeckOfCards(); // cards is basically Linked List.. cards = new LinkedList<Cards>()
for(int i=0;i<cards.size();i++)
{
int randomNumber = randomGenerator.nextInt(52);
Card c1 = cards.remove(randomNumber);
Card c2 = cards.remove(0);
cards.add(0, c1);
cards.add(randomNumber,c2);
}
}
在上面的代码中,我抛出了 IllegalArgumentException ,这是我最怀疑的。在什么条件下应该实际抛出运行时异常?我们真的应该抛出运行时异常吗?
由于
答案 0 :(得分:30)
我们真的应该抛出运行时异常吗?
是的,我们应该。运行时异常用于特定目的 - 它们表示编程问题,只能通过更改代码来修复,而不是更改程序运行的环境。
在什么条件下应该实际抛出运行时异常?
当您使用类或方法的方式检测到错误时,抛出运行时异常。
通常,当您需要抛出运行时异常时,有两类情况:
从这个意义上说,你的代码很好:它完全适合第一类,即传递无效的参数值。我会做的一件事略有不同的是添加一条消息来说明哪个参数的值无效,但在你的情况下它并不重要,因为那里只有一个参数。
答案 1 :(得分:9)
IllegalArgumentException
is, in fact, a subclass of RuntimeException
最好更具体一点,以帮助其他程序员。我肯定更喜欢IllegalArgumentException
,因为它最好地描述了究竟出了什么问题,但实际上,任何一个都可以工作。
答案 2 :(得分:3)
例如,如果您正在读取文件,并且发生了一些IO错误,则您不太可能从错误中恢复,因此将错误重新抛到顶部并因此终止应用程序isn&# 39;做坏事。
另一方面,如果您预计可恢复的错误,那么您应该绝对捕获并处理错误。例如,您可能让用户在表单中输入数据。如果输入数据不正确,输入处理代码可能会抛出异常(例如,在解析格式错误的数字字符串时为NumberFormatException
)。您的代码应捕获这些异常并向用户返回错误,提示输入正确。
当捕获异常并抛出RuntimeException
时,将原始异常设置为RuntimeException的原因非常重要。即。
抛出新的RuntimeException(originalException)
。