1

我有一些基本问题: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");
    }
}

代码工作正常。当我将负值设置为“大小”变量时,块中的代码:

catch(myArrayException e) {
    System.out.print("hello");
}

得到正确执行。但如果我添加

public static void myMethod() throws myArrayException

并删除 if 条件,然后我编写的 catch 块不会执行。谁能告诉我为什么?特别是因为我为该方法指定了“throws myArrayException”?

4

3 回答 3

4

throws表示该函数可以抛出异常。这并不意味着它总是抛出异常。

简而言之,添加throws语句确保调用该方法的人必须为此异常添加 try..catch 块。

读取已检查和未检查的异常

于 2013-03-06T15:14:07.913 回答
0

您应该学习的 oracle 站点上有一个教程。它将帮助您理解异常。链接是:

http://docs.oracle.com/javase/tutorial/essential/exceptions/definition.html

于 2013-03-06T15:22:33.050 回答
0

添加到有关throwsJava 关键字的信息中,您似乎编写了一个实际上无法执行的程序。或者更确切地说,它被一个未处理的异常停止。你说

但是如果我添加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表示该函数可以抛出异常。这并不意味着它总是抛出异常。

  1. “myMethod throws myArrayException”对我的代码有影响吗?不行,没有效果。这只是对其他人的警告。
  2. 如果我删除整个“if”块,那么 JRE 本身会处理它吗?JRE 处理任何未捕获的异常,因为它是最高级别的程序。如果删除 if 块其中的throw语句,则NegativeArraySizeException在传入净大小时会抛出 a (从数组分配的行:int[] a = new int[size];),而不是 a MyArrayExcpetion
  3. 所以throwmyMethod 中的声明很重要而不是myMethod throws myArrayException重要是一个相对术语。该throw语句对于立即执行的代码很重要,因为它会影响程序流程和执行。对throws myArrayException方法声明没有任何直接影响。但是,如果您希望此代码在足够长的一段时间内被他人甚至您自己广泛使用,以至于您可能不记得在编写应用程序的每一行最后一行时在想什么,那么它就变得非常重要,因为...
  4. 因为,即使没有这个语句代码也可以正常工作......为什么要添加这个语句? 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 的微弱记忆拼凑而成的。我不知道受检异常的确切定义,但希望我至少能抓住它的本质以及它与未受检异常的区别。如果我弄错了,请纠正我。

编辑:做更多阅读,我认为我对什么是检查异常和不是检查异常非常错误。希望有人能纠正我。

于 2013-03-06T16:02:22.903 回答