添加到有关throws
Java 关键字的信息中,您似乎编写了一个实际上无法执行的程序。或者更确切地说,它被一个未处理的异常停止。你说
但是如果我添加public static void myMethod() throws myArrayException
和删除 if 条件
如果通过“if 条件”,您的意思是此检查:
if (size < 0) {
throw new myArrayException();
}
然后MyMethod
不再抛出myArrayException
。相反,该语句int[] a = new int[size];
将抛出一个NegativeArraySizeException
您没有捕获的异常,使其成为未处理的异常,这通常会停止程序的执行。在这种情况下,该行System.out.print("code successfully reached");
也不会执行,看起来你的程序什么也没做。
要回答您的具体问题(完全披露,自从我使用 Java 以来一直如此),throws
关键字更多的是对您的方法的免责声明。它不影响方法的编译或执行。正如 baraky 所说:
throws
表示该函数可以抛出异常。这并不意味着它总是抛出异常。
- “myMethod throws myArrayException”对我的代码有影响吗?不行,没有效果。这只是对其他人的警告。
- 如果我删除整个“if”块,那么 JRE 本身会处理它吗?JRE 处理任何未捕获的异常,因为它是最高级别的程序。如果删除 if 块和其中的
throw
语句,则NegativeArraySizeException
在传入净大小时会抛出 a (从数组分配的行:int[] a = new int[size];
),而不是 a MyArrayExcpetion
。
- 所以
throw
myMethod 中的声明很重要而不是myMethod throws myArrayException
?重要是一个相对术语。该throw
语句对于立即执行的代码很重要,因为它会影响程序流程和执行。对throws myArrayException
方法声明没有任何直接影响。但是,如果您希望此代码在足够长的一段时间内被他人甚至您自己广泛使用,以至于您可能不记得在编写应用程序的每一行最后一行时在想什么,那么它就变得非常重要,因为...
- 因为,即使没有这个语句代码也可以正常工作......为什么要添加这个语句?
throws
基本上告诉其他任何人查看您的代码“嘿,如果您调用此代码,您最好处理这些异常,否则您的程序可能会崩溃。” 您不必包含此声明,但如果您这样做,它会使每个人的生活更轻松。
如果您的方法捕获到异常,则不应说它抛出该异常。使用“已检查与未检查”的术语在代码中分解它,自从我使用 Java 以来,这种术语似乎变得很流行:
public static void MyMethod() throws MyArrayException{
int size = 5;
if (size < 0) {
// Unchecked exception, properly warned callers of MyMethod that you will
// throw it and they need to catch it
throw new MyArrayException();
}
if (size == 3) {
// Unchecked exception, but you didn't warn callers of MyMethod
// No functional impact for your code, but if someone else is relying
// on this method, they won't know catch this and will likely be
// irate with you if it crashed their program
throw new IHateThreesException();
}
try {
int[] a = new int[size];
}
catch(NegativeArraySizeException)
{
// This is a checked exception, because you checked for it with a
// try-catch block and don't re-throw it
System.out.print("Code checked for this but size " + size + " was negative anyways!");
}
catch(OutOfMemoryExcpetion ome)
{
// I _think_ this is still an unchecked exception, because the I choose
// to re-throw it. Regardless, we explicitly throw this exception so
// there is no excuse for us to not have included it in the throws
// declaration
System.out.print("I just canno' do it captain, I don't have the memory!"
+ "(Free up some memory and try again)");
throw ome;
}
System.out.print("code successfully reached");
}
这些示例是根据其他人所说的以及我自己对 Java 的微弱记忆拼凑而成的。我不知道受检异常的确切定义,但希望我至少能抓住它的本质以及它与未受检异常的区别。如果我弄错了,请纠正我。
编辑:做更多阅读,我认为我对什么是检查异常和不是检查异常非常错误。希望有人能纠正我。