何时引发运行时异常?

2022-09-01 08:16:53

最近,我面试了公司,他们给了我一个编码问题。我得到了与一副纸牌相关的程序,其中一种方法是洗牌。所以我把这个程序写成:

/** 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);
    }       

}

在上面的代码中,我抛出了我最怀疑的非法争论。在什么情况下应该实际引发运行时异常?我们是否应该实际引发运行时异常?

谢谢


答案 1

我们是否应该实际引发运行时异常?

是的,我们应该这样做。运行时异常用于特定目的 - 它们表示编程问题只能通过更改代码来修复,而不是更改程序运行的环境。

在什么情况下应该实际引发运行时异常?

当您检测到类或方法的使用方式有错误时,请引发运行时异常。

通常,在需要引发运行时异常时,有两类情况:

  • 传递无效的参数值 - 这是运行时异常的最常见原因。大多数参数验证异常应该是运行时异常。Java 提供了几个子类来表示这些特定问题。
  • 以错误的顺序调用方法 - 这是另一个常见原因。当在类完成初始化或其他一些准备步骤之前无法调用某些方法时,在错误的时间调用应会导致运行时异常。

从这个意义上说,你的代码很好:它正好适合第一类,即传递无效的参数值。我会做的一件事略有不同,那就是添加一条消息来说明哪个参数具有无效值,但在您的情况下,它并不重要,因为那里只有一个参数。


答案 2

事实上,IllegalArgumentExceptionRunningException的一个子类

最好是更具体一点,以便将来帮助其他程序员。我肯定更喜欢,因为它最能描述究竟出了什么问题,但实际上,任何一个都可以。IllegalArgumentException