抛出 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 方法的代码。我真的不知道如何处理异常。
您的教授可能希望您观察到的是编译错误。数组的类型在实例化时是固定的,不会改变。该数组将只接受它声明接受的任何类型,而不接受其他任何类型。
从这里开始对例外情况进行一些小抱怨。
让我们快速聊聊已检查和未检查的异常。这两者之间是有区别的,有时将它们混在一起会很痛苦。
让我们从检查异常开始。这些是您 必须 明确捕获自己或声明抛出的异常。沿着这些方向的东西是 IOException
、FileNotFoundException
* 和其他一些东西——几乎任何从 Exception
class.
延伸出来的东西
Java 告诉你你有能力从这个错误中恢复,你作为一个好的开发者应该确保你的程序 做 .
还有未经检查的异常;任何扩展 RuntimeException
或 Error
的东西。这些 not 不需要声明为抛出,因为它们发生在应用程序的运行期间,并且实际上无法保证程序是否 应该 从此错误中恢复。这方面的一个例子是 ArithmeticException
;如果您的应用程序试图除以零,它真的应该恢复吗?它会处于什么状态?
还有一些您根本不应该抓到的 - 如果您设法抓到 OutOfMemoryError
,您会 return 做什么?那时你真的无能为力!
现在,对于您的代码:您已经 声明了一个未经检查的异常被抛出。 这是有效的语法,但是 Java 不会随意抛出对你来说是个例外,因为那段代码中没有任何东西会抛出它。在最差,你可以得到一个ArrayIndexOutOfBoundsException
,但那不是IllegalArgumentException
。
为了真正抛出那个未经检查的异常,你需要明确地抛出它:
throw new IllegalArgumentException();
...而且您还需要一个充分的理由才能这样做。异常是昂贵的。
*:我意识到 FileNotFoundException
是一个 IOException
。还在勾选。
因此,对于家庭作业,我们的教授希望我们尝试将整数插入字符串数组:
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 方法的代码。我真的不知道如何处理异常。
您的教授可能希望您观察到的是编译错误。数组的类型在实例化时是固定的,不会改变。该数组将只接受它声明接受的任何类型,而不接受其他任何类型。
从这里开始对例外情况进行一些小抱怨。
让我们快速聊聊已检查和未检查的异常。这两者之间是有区别的,有时将它们混在一起会很痛苦。
让我们从检查异常开始。这些是您 必须 明确捕获自己或声明抛出的异常。沿着这些方向的东西是 IOException
、FileNotFoundException
* 和其他一些东西——几乎任何从 Exception
class.
Java 告诉你你有能力从这个错误中恢复,你作为一个好的开发者应该确保你的程序 做 .
还有未经检查的异常;任何扩展 RuntimeException
或 Error
的东西。这些 not 不需要声明为抛出,因为它们发生在应用程序的运行期间,并且实际上无法保证程序是否 应该 从此错误中恢复。这方面的一个例子是 ArithmeticException
;如果您的应用程序试图除以零,它真的应该恢复吗?它会处于什么状态?
还有一些您根本不应该抓到的 - 如果您设法抓到 OutOfMemoryError
,您会 return 做什么?那时你真的无能为力!
现在,对于您的代码:您已经 声明了一个未经检查的异常被抛出。 这是有效的语法,但是 Java 不会随意抛出对你来说是个例外,因为那段代码中没有任何东西会抛出它。在最差,你可以得到一个ArrayIndexOutOfBoundsException
,但那不是IllegalArgumentException
。
为了真正抛出那个未经检查的异常,你需要明确地抛出它:
throw new IllegalArgumentException();
...而且您还需要一个充分的理由才能这样做。异常是昂贵的。
*:我意识到 FileNotFoundException
是一个 IOException
。还在勾选。