因此,对于家庭作业,我们的教授希望我们尝试将一个整数插入一个字符串数组中:
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方法的代码。我还不知道如何处理异常。
答案 0 :(得分:1)
您的教授可能希望您观察的是编译错误。数组的类型在即时时间固定,不会改变。该数组将只接受声明接受的任何类型,而不接受任何其他类型。
对此处的例外情况进行轻微的咆哮。
让我们快速聊聊已检查和未检查的例外情况。这两者之间存在差异,将它们混合在一起可能会很痛苦。
让我们从检查过的异常开始。这些是您必须明确捕获自己或声明它们被抛出的例外情况。这些内容包括IOException
,FileNotFoundException
*和其他一些内容 - 几乎任何来自Exception
类的内容。
Java告诉您,您有能力从此错误中恢复,而您作为一名优秀的开发人员应该确保您的程序 。
还有未经检查的例外情况;任何延伸RuntimeException
或Error
的内容。这些 not 需要被声明为抛出,因为它们在应用程序的运行时期间发生,并且实际上无法保证程序应从此错误中恢复。一个例子是ArithmeticException
;如果你的申请试图除以零,你的申请是否真的会恢复?它会处于什么状态?
还有一些你真的不应该抓到 - 如果你设法赶上OutOfMemoryError
,你会回到什么?那时你真的无能为力!
现在,对于你的代码:你已经声明了一个未经检查的异常被抛出。这是有效的语法,但Java不会随意为你抛出异常,因为它没有'在那个会抛出它的代码块中的任何东西。 最差,您可以获得ArrayIndexOutOfBoundsException
,但这不是IllegalArgumentException
。
为了实际抛出该未经检查的异常,您需要明确抛出它:
throw new IllegalArgumentException();
......你也需要有充分的理由这样做。例外是昂贵的。
*:我意识到FileNotFoundException
是一个 IOException
。它仍在检查中。