构造函数中的异常,java

时间:2014-02-22 22:39:49

标签: java

我遇到一个简单的Java代码问题。我试图在构造函数中抛出异常并在那里处理它。但它不会编译,因为,还需要在main函数中处理此异常。我收到错误 - “未处理的异常类型MyException”(在main函数中)。 如果我把try和catch块放在main中它运行良好,但尽管如此,MyException是在Construcor的FailingConstructor类中处理的。

我想知道为什么我需要两次处理这个异常?

   class MyException extends Exception{
       MyException()
       {
         System.out.println("Throws MyException");
       } 
   }

   public class FailingConstructor{
      int a;
      int b;

FailingConstructor(int a, int b) throws MyException
{

    try{
        this.a=a;
    if(this.a==9)
        {
            throw new MyException();
        }
    this.b=b;
    }catch(MyException e)
    {
        System.out.println("Wyjatek z poziomu konstruktora");
    }


}

public static void main(String[] args)
{
    FailingConstructor nowy = new FailingConstructor(9,6);
    System.out.println(nowy.a);
    System.out.println(nowy.b);



}

}

使用此主要功能的代码效果很好:

        public static void main(String[] args)
        {
          try{
                  FailingConstructor nowy = new FailingConstructor(9,6);
              System.out.println(nowy.a);
              System.out.println(nowy.b);
          }
          catch(MyException e)
          {
          e.printStackTrace();
          }


        }

6 个答案:

答案 0 :(得分:0)

你声明你将抛出一个异常,但你没有在main中尝试catch。

如果您不希望构造函数外部出现异常,则可以删除throws,否则需要在main中尝试catch。

答案 1 :(得分:0)

解决方案非常简单:从构造函数中删除throws MyException。当它存在时,编译器会受到很大的创伤,因为可能会抛出某种经过检查的异常。要意识到总是会处理这样一个经过检查的异常,这是不够聪明的。

答案 2 :(得分:0)

只需从构造函数throws MyException声明

中删除FailingConstructor即可

答案 3 :(得分:0)

您可以在FailingConstructor中删除throws MyException,也可以删除try / catch子句,只需简单地抛出MyException语句即可。每当显式抛出异常(或使用已检查的异常)时,处理该部分的方法必须具有捕获它的机制,或者应该明确声明它将抛出该异常。

答案 4 :(得分:0)

问题是您要两次声明异常。您无需在构造函数中说throws MyException - 您拥有的try / catch块就可以解决它。如果你也说throws MyException,那么编译器会认为你的构造函数会抛出你捕获的异常之外的另一个异常。

答案 5 :(得分:0)

如果声明该方法将抛出异常,请确保使用此函数的某些人将处理它。

您无法在方法main中声明异常,因为它无法处理。