我已经捕获了声明和捕获的异常,但仍然存在错误

时间:2014-02-04 13:49:04

标签: java exception-handling

class HelloWorld extends Exception {
    HelloWorld(String s) {
        System.out.println("helllo" + s);
    }
}

class myclass {
    void go() throws HelloWorld {
        System.out.println("my mom");
    }
}

public class ting {
    public static void main(String[] args) {
        try {
            myclass h= new myclass();
            h.go();
        } catch(HelloWorld e) {
            throw new HelloWorld("world");
        }
    }
}

我读到这一点,我们总是需要声明一个异常,直到我们抓住它。如上所述,我使用自定义异常HelloWorld,当我将此异常抛出到其他类,即myclass.Moreover时,我在main方法中捕获了此异常。为什么它不起作用?

o/p : ting.java:17: error: unreported exception HelloWorld; must be caught or declared to be thrown
         throw new HelloWorld("world");
         ^
1 error 

3 个答案:

答案 0 :(得分:1)

出于某种原因,您正在从catch块中抛出异常

解决方案:

  • 声明您的mainthrows HelloWorld

    public static void main(String[] args) throws HelloWorld

  • 再次使用try-catch围绕它,但那会非常奇怪:


catch(HelloWorld e){
   try {
       throw new HelloWorld("world");
       } catch (HelloWorld e1) { }
   }
}

注意:您最好为例外 HelloWorldExcption命名。

答案 1 :(得分:1)

在我看来,你似乎没有完全掌握试图完成的异常,或者我完全不理解你将代码抽象到这个例子中的方式。

我将尝试创建一个类似的示例,该示例应解释大多数情况下如何使用异常:

public class MyClass {
    class UnexpectedException extends Exception {
        UnexpectedException(String msg) {
            super(msg);
        }
    }

    public static void main(String[] args) {
        MyClass c = new MyClass();
        try {
            System.out.println(c.computeMessage());
        } catch (UnexpectedException e) {
            System.err.println("Something unexpected happened: " + e.getMessage());
        }
    }

    public String computeMessage() throws UnexpectedException {
        // Try to compute a message here, but something goes wrong so:
        throw new UnexpectedException("Oh no, could not compute the message!");
    }
}

当异常发生时抛出异常,并且为了通知程序员可能发生异常情况,方法声明可以声明它们可能抛出某个异常。

然后,程序员可以“捕获”潜在抛出的异常,以便在发生异常的特殊情况下提供调试或恢复代码。

我希望这可以澄清什么是例外,以及如何使用它们。如果您有更多问题,请与我们联系。

编辑:要解决您遇到的错误,如果将行throw new HelloWorld("world")从catch块移到go方法,那么您的示例应该可以正常工作。

答案 2 :(得分:0)

您已经捕获HelloWorld方法声明为可抛出的go()异常。在大多数情况下,你不想抓住它并重新抛出它。您可以声明main()抛出异常,而不是捕获go()引发的异常,而不必捕获它 - 尽管这不是一个好习惯。此外,应该命名例外:

HelloWorldException

而不是:HelloWorld