异常处理:了解基础知识

时间:2013-03-06 15:10:43

标签: java exception-handling

我有一些基本问题: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”?

3 个答案:

答案 0 :(得分:4)

throws表示函数可以抛出异常。 意味着始终会抛出异常。

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

阅读checked and unchecked exceptions

答案 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表示该函数可以抛出异常。这并不意味着它总是抛出异常。

  1. “myMethod抛出myArrayException”对我的代码有什么影响?没有,没有效果。这只是对他人的警告。
  2. 如果我删除整个“if”块,那么JRE本身会处理它吗? JRE处理任何未捕获的异常,因为它是最高级别的程序。如果删除if块其中的throw语句,则在传入netagive大小时会抛出NegativeArraySizeException(从数组分配的行开始: int[] a = new int[size];),而不是MyArrayExcpetion
  3. 因此,myMethod中的throw语句很重要而不是myMethod throws myArrayException重要是一个相对术语。 throw语句对于立即执行的代码很重要,因为它对程序流和执行有影响。方法声明中的throws myArrayException没有任何直接影响。 但是如果你希望这些代码被广泛使用,其他人甚至是你自己在一段时间内,你可能不记得你在编写应用程序的每一行最后一行时的想法,然后它变得非常重要,因为......
  4. 因为,即使没有这个语句代码也能正常工作....为什么要添加这个语句? throws基本上告诉其他人查看你的代码“嘿,你最好处理这些异常,如果你调用这段代码,否则你的程序可能会崩溃。“你没有拥有来包含这个声明,但如果你这样做,它会让每个人的生活更轻松。
  5. 如果您的方法捕获异常,那么它不应该说它抛出该异常。使用自我使用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的微弱记忆。我不知道已检查异常的确切定义,但希望我至少捕获它的本质以及它与未经检查的异常的区别。如果我弄错了,请纠正我。

    编辑:做一些更多的阅读,我认为我错误的是什么是非检查异常。希望有人可以纠正我。