抛出 IllegalArgumentException 无效

Throwing an IllegalArgumentException isn't working

因此,对于家庭作业,我们的教授希望我们尝试将整数插入字符串数组:

public boolean addPerson(V person, int number)throws IllegalArgumentException{
    if(numEntries < people.length){
        people[numEntries] = person;
        phones[numEntries] = number;
        numEntries++;
        return true;
    }
    return false;
}

public static void main(String[] args){
    PhoneBook<String> names = new PhoneBook<String>();
    PhoneBook<Integer> ssn = new PhoneBook<Integer>();
    names.addPerson("john", 1235681213);
    ssn.addPerson(123324567, 2048);
    Integer soc = 132546789;
    try{
        names.addPerson(soc, 1996);
    }
    catch(IllegalArgumentException e){
        System.out.println("You cannot enter a Social Security Number "
            + "into the Name phone book!");
    }

但是,这是行不通的,我仍然得到与没有 try-catch 时相同的错误。知道我做错了什么吗?

编辑 抱歉,我可能应该包含 addPerson 方法的代码。我真的不知道如何处理异常。

您的教授可能希望您观察到的是编译错误。数组的类型在实例化时是固定的,不会改变。该数组将只接受它声明接受的任何类型,而不接受其他任何类型。

从这里开始对例外情况进行一些小抱怨。


让我们快速聊聊已检查和未检查的异常。这两者之间是有区别的,有时将它们混在一起会很痛苦。

让我们从检查异常开始。这些是您 必须 明确捕获自己或声明抛出的异常。沿着这些方向的东西是 IOExceptionFileNotFoundException* 和其他一些东西——几乎任何从 Exception class.

延伸出来的东西

Java 告诉你你有能力从这个错误中恢复,你作为一个好的开发者应该确保你的程序 .

还有未经检查的异常;任何扩展 RuntimeExceptionError 的东西。这些 not 不需要声明为抛出,因为它们发生在应用程序的运行期间,并且实际上无法保证程序是否 应该 从此错误中恢复。这方面的一个例子是 ArithmeticException;如果您的应用程序试图除以零,它真的应该恢复吗?它会处于什么状态?

还有一些您根本不应该抓到的 - 如果您设法抓到 OutOfMemoryError,您会 return 做什么?那时你真的无能为力!

现在,对于您的代码:您已经 声明了一个未经检查的异常被抛出。 这是有效的语法,但是 Java 不会随意抛出对你来说是个例外,因为那段代码中没有任何东西会抛出它。在最差,你可以得到一个ArrayIndexOutOfBoundsException,但那不是IllegalArgumentException

为了真正抛出那个未经检查的异常,你需要明确地抛出它:

throw new IllegalArgumentException();

...而且您还需要一个充分的理由才能这样做。异常是昂贵的。

*:我意识到 FileNotFoundException 是一个 IOException。还在勾选。