什么时候抛出运行时异常?

use*_*771 20 java exception

最近,我接受了公司的采访,他们给了我一个编码问题.我得到了与卡片组相关的程序,其中一种方法是洗牌.所以我把程序写成:

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

}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我抛出了IllegalArgumentException,这是我最怀疑的.在什么条件下应该实际抛出运行时异常?我们应该抛出运行时异常吗?

谢谢

das*_*ght 33

我们应该抛出运行时异常吗?

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

在什么条件下应该实际抛出运行时异常?

使用类或方法的方式检测错误时,抛出运行时异常.

通常,当您需要抛出运行时异常时,有两种情况:

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

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

  • 恐怕这个答案并没有解释为什么在这两种情况下应该抛出运行时异常?扔它们能得到什么?我也对检查异常和运行时异常之间的区别的这种解释感到困惑:检查异常表示需要“更改程序运行的环境”......我想知道作者的意思 - 什么是“环境”? (3认同)

Doo*_*nob 11

IllegalArgumentException事实上,它是一个子类RuntimeException.

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