我有一些基本问题:Java中异常处理的基础知识。我已经实现了自己的异常类myArrayException
,它扩展了NegativeArraySizeException
。代码非常基本,整个过程如下所示:
class myArrayException extends NegativeArraySizeException {
myArrayException() {
super("my custom exception class");
}
}
public class myClass {
public static void main(String args[]) {
try {
myMethod();
} catch (myArrayException e) {
System.out.print("hello");
}
}
public static void myMethod() {
int size = 5;
if (size < 0) {
throw new myArrayException();
}
int[] a = new int[size];
System.out.print("code successfully reached");
}
}
代码工作正常。当我将负值设置为“size”变量时,块中的代码为:
catch(myArrayException e) {
System.out.print("hello");
}
正确执行。但如果我添加
public static void myMethod() throws myArrayException
并删除if条件,然后我写的catch块不会执行。谁能告诉我为什么?特别是因为我为该方法指定了“throws myArrayException”?
答案 0 :(得分:4)
throws
表示函数可以抛出异常。 不意味着始终会抛出异常。
简而言之,添加throws
语句可确保调用该方法的人必须为此异常添加try .. catch块。
答案 1 :(得分:0)
您应该学习oracle网站上的教程。它将帮助您理解异常。链接是:
http://docs.oracle.com/javase/tutorial/essential/exceptions/definition.html
答案 2 :(得分:0)
添加关于Java的throws
关键字的信息,看起来您可能编写了一个实际上不执行的程序。或者更确切地说,它是由未处理的异常停止的。你说
但是如果我添加
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
表示该函数可以抛出异常。这并不意味着它总是抛出异常。
throw
语句,则在传入netagive大小时会抛出NegativeArraySizeException
(从数组分配的行开始: int[] a = new int[size];
),而不是MyArrayExcpetion
。throw
语句很重要而不是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的微弱记忆。我不知道已检查异常的确切定义,但希望我至少捕获它的本质以及它与未经检查的异常的区别。如果我弄错了,请纠正我。
编辑:做一些更多的阅读,我认为我错误的是什么是非检查异常。希望有人可以纠正我。