构造默认构造函数时无法处理异常:隐式超类构造函数抛出的异常类型

11
代码运行良好,直到我尝试将代码制作成可构造的类。当我尝试从中构建一个对象时,我会收到错误消息:“默认构造函数无法处理隐式超级构造函数抛出的IOException异常类型。必须定义显式构造函数”。这是因为需要向FileReader和BufferedReader抛出异常。谢谢。
编辑:
FileReader textFilethree = new FileReader (xFile);
BufferedReader bufferedTextthree = new BufferedReader (textFilethree) ;
String lineThree = bufferedTextthree.readLine();

这个xFile是从构造函数获得的。请注意,在构造函数中会抛出异常。

5个回答

6

默认构造函数隐式调用超类构造函数,假定超类构造函数会抛出一些异常,需要在子类构造函数中处理。如需详细答案,请发布代码。

class Base{

  public Base() throw SomeException{
    //some code
  }

}

class Child extends Base{
  public Child(){
   //here it implicitly invokes `Base()`, So handle it here
  }
}

1
你需要添加相关的构造函数。 - jmj
1
所以你需要在子类的构造函数中捕获或抛出它。 - jmj
再次构建时,您需要处理它。它会传播。 - jmj
等等,我不明白你的例子怎么适用于我,因为我没有任何子类。很抱歉我没理解。 - Ian
@JigarJoshi 让我们在聊天室里继续这个讨论 - Ian
显示剩余2条评论

3

当扩展类构造函数被调用时,基类super.constructor会被隐式地调用:

class Base
{
  public Base () throws Exception
  {
    throw <>;
  }
}

class Derived extends Base
{
  public Derived ()
  {
  }
}

现在,需要在Derived()内部处理异常,或者将构造函数修改为:
public Derived() throws Exception
{
}

无论你使用什么方式创建Derived的对象,无论是将其包含在try-catch中还是使该方法抛出异常(如上所示)。
[注:这是伪代码]

我正在考虑忘记那个IDE错误,我运行了它,没有问题。如果我这样做,以后会遇到问题吗? - Ian

2

只需将构造函数调用放在Try-Catch块中即可。


0

如果你有类似这样的东西

class example{
    public void fileReader(String path) throws Exception{
         //some code that throws Exception
    }
 }

请确保在您尝试创建对象的方法中使用相同的语法

class implementation{
     public void someMethod() throws Exception{
          example object = new example();
          example.filereader("C:\\....");
      }
  }

在使用Apache POI时发生了这种情况。


0
任何继承默认构造函数处理某些异常的超类的子类,都必须有一个实现该异常的默认构造函数。
例如:
class Super{ public Super() throws Exception { } }
class Sub extends Super{ public Sub() throws Exception{ } }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接