связывание конструкторов в Java без исключения исключений из конструктора по умолчанию - PullRequest
1 голос
/ 19 августа 2011

Я прочитал это: Могу ли я использовать броски в конструкторе? - что дало мне правильную идею и привело меня к одному ответу, но не было очень явным.Я также прочитал несколько других, но не смог найти свой ответ.Если вспомнить, что я узнал для контекста, по сути, это не скомпилирует ...

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

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

... потому что конструктор FileInputStream (вызывается из конструктора String) может генерировать исключение FileNotFoundException.Вы все еще можете создать конструктор, заставив it выдать такое же исключение, как показано ниже:

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

Мой вопрос связан с конструктором по умолчанию (без аргументов), который просто использовал бы имя файла по умолчаниюСтроковая константа:

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

Это будет связывать конструкторы как:

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

InВ таком случае можно ли использовать значение по умолчанию (статический конечный член класса) в конструкторе по умолчанию, чтобы создать экземпляр (далее по цепочке) FileInputStream, но не нужно использовать код throws FileNotFoundException (для этого потребуется кто-тос помощью класса перебрасывать или обрабатывать исключение?

Если бы я мог сделать что-то вроде следующего, я бы обработал исключение сам:

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

...Однако, насколько я знаю, это невозможно, потому что «вызов конструктора должен быть первым оператором в конструкторе»

Будучи более привыкшим к .Net на данный момент, я никогда не был заставил иметь дело с бывшимиесли бы я действительно не хотел ...: D

Ответы [ 4 ]

2 голосов
/ 19 августа 2011

Измените код построения вашего файла из вашего конструктора, чтобы вы могли сделать что-то вроде этого -

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
}
0 голосов
/ 19 августа 2011

По сути, вам нужно выполнить работу, которую должен выполнять ваш конструктор, в другом методе (который не является конструктором), а затем использовать его в конструкторе по умолчанию.Но я не уверен, насколько полезна эта техника в вашем сценарии.

ура!

0 голосов
/ 19 августа 2011

Вы можете сделать что-то вроде этого:

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 в дальнейшем вызовет горе.

В общем случае лучше выбрасывать исключение как можно ближе к источнику ошибки.

0 голосов
/ 19 августа 2011

Вы правы, что не можете поймать исключение из вызова этого (...).

Вы можете использовать статический метод для получения того, что вы хотите:

static ExampleClass createDefault()
{
  try
  {
    return new ExampleClass(DEFAULT_FILE_NAME);
  }
  catch(Exception e)
  {
    DoSomethingToHandleException(e)
  } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...