1

我读过这个:我可以在构造函数中使用 throws 吗?- 这给了我正确的想法,并引导我得到一个答案,但不是很明确。我也阅读了其他几个,但找不到我的答案。回顾一下我从上下文中学到的东西,基本上,这不会编译......

public ExampleClass(String FileName)
{
   this(new FileInputStream(FileName));
}

public ExampleClass(FileInputStream FileStream)
{
   DoSomethingToSetupBasedUponFileStream(FileStream);
}

...因为FileInputStream构造函数(从字符串构造函数调用)可能会抛出 FileNotFoundException。您仍然可以通过使其抛出相同的异常来创建构造函数,如下所示:

public ExampleClass(String FileName) throws FileNotFoundException
{
   this(new FileInputStream(FileName));
}

我的问题与默认构造函数(无参数)有关,该构造函数仅使用默认文件名字符串常量:

public ExampleClass() throws FileNotFoundException
{
   this(DEFAULT_FILE_NAME);
}

这会将构造函数链接为:

ExampleClass()--> ExampleClass(<String>)-->ExampleClass(<InputFileStream>)

在这种情况下,是否可以在默认构造函数中使用默认值(静态最终类成员)来实例化(进一步沿着链) FileInputStream,但不必使用throws FileNotFoundException代码(这需要有人使用类重新抛出或处理异常?

如果我可以执行以下操作,我将自己处理异常:

public ExampleClass()
{
   try
   {
      this(DEFAULT_FILE_NAME);
   }
   catch (Exception e)
   {
      DoSomethingToHandleException(e);
   }
}

...但是,据我所知,这是不可能的,因为“构造函数调用必须是构造函数中的第一条语句”

在这一点上更习惯于.Net,如果我真的不想这样做,我从来没有被迫处理异常......:D

4

4 回答 4

1

从你的构造函数中重构你的文件构造代码,所以你可以做这样的事情——

public ExampleClass() {
  try {
      fileInputStreamMethod(DEFAULT_FILE);
  }
  catch(Exception e) {
    ...
  }

public ExampleClass(String fileName) throws Exception {
    fileInputStreamMethod(fileName);
}

private void fileInputStreamMethod(String fileName) throws Exception {
    // your file handling methods
}
于 2011-08-19T18:36:46.913 回答
0

您是正确的,您无法从对 this(...) 的调用中捕获异常。

您可以使用静态方法来生成您想要的内容:

static ExampleClass createDefault()
{
  try
  {
    return new ExampleClass(DEFAULT_FILE_NAME);
  }
  catch(Exception e)
  {
    DoSomethingToHandleException(e)
  } 
}
于 2011-08-19T18:36:28.583 回答
0

你可以这样做:

public ExampleClass(String FileName)
{
   this(getStream(FileName));
}

private static FileInputStream getStream(String name) {
    try {
        return new FileInputStream(name);
    } catch (Exception e) {
        // log error
        return null;
    }
}

真正的问题是,你为什么不想抛出异常?如果文件无法打开,您的程序应该如何运行?我认为您希望它像没有问题一样继续进行是不寻常的。很可能,null输入流稍后会引起悲伤。

一般来说,最好在尽可能靠近错误源的地方抛出异常。

于 2011-08-19T18:37:03.867 回答
0

基本上你要做的就是用不同的方法(不是构造函数)做你的构造函数必须做的工作,然后在默认构造函数中使用它。但我不确定这种技术在您的场景中有多有用。

干杯!

于 2011-08-19T18:49:10.793 回答