Переменная объекта PrintWriter не может разрешить тип при использовании в попытке с ресурсами

Я пытаюсь создать новый объект PrintWriter в блоке try с ресурсами, как показано ниже, но выдает ошибку outFile cannot be resolved to a type:

public class DataSummary {

    PrintWriter outFile;

    public DataSummary(String filePath) {

        // Create new file to print report
        try (outFile = new PrintWriter(filePath)) {

        } catch (FileNotFoundException e) {
            System.out.println("File not found");
            e.printStackTrace();
        }

    }

ИЗМЕНИТЬ:

Причина, по которой я не хотел объявлять объект PrintWriter в блоке try, заключается в том, что я хочу иметь возможность ссылаться на объект outFile в других методах моего класса.

Похоже, я не могу сделать это с помощью try с ресурсами, поэтому я создал его в обычном блоке try/catch/finally.

Текстовый файл создается. Однако, когда я пытаюсь записать в файл другим способом, в текстовом файле ничего не печатается, test.txt.

Почему это??

public class TestWrite {

  PrintWriter outFile;

  public TestWrite(String filePath) {

    // Create new file to print report
    try {
      outFile = new PrintWriter(filePath);
    } catch (FileNotFoundException e) {
      System.out.println("File not found");
      e.printStackTrace();
    } finally {
      outFile.close();
    }
  }

  public void generateReport() {
    outFile.print("Hello world");
    outFile.close();
  }
}

person doctopus    schedule 05.11.2018    source источник
comment
Это не законно. try (PrintWriter outFile = new PrintWriter(filePath)) {   -  person Elliott Frisch    schedule 05.11.2018
comment
Возможно, вы захотите взглянуть на этот вопрос (stackoverflow.com/questions/13836486/)   -  person Sachin Kumar    schedule 05.11.2018
comment
@ElliottFrisch, но что, если я хочу назначить outFile в качестве переменной экземпляра?   -  person doctopus    schedule 05.11.2018
comment
@doctopus Тогда вы не можете использовать try-with-resources.   -  person Elliott Frisch    schedule 05.11.2018
comment
@ElliottFrisch Я отредактировал свой исходный пост. По какой-то причине даже с обычным try/catch файл создается, но я все еще не могу записать в файл   -  person doctopus    schedule 05.11.2018
comment
Потому что вы close это в блоке finally конструктора. Не делайте этого.   -  person Elliott Frisch    schedule 05.11.2018
comment
Понятно. Это понятно, почему я не могу писать. Но проблема в том, что если я не включу это, как я могу закрыть outFile, если возникнет исключение?   -  person doctopus    schedule 05.11.2018
comment
Вот почему try-with-resources был изобретен. То, что вы делаете, называется антишаблон.   -  person Elliott Frisch    schedule 05.11.2018
comment
спасибо @ElliottFrisch   -  person doctopus    schedule 05.11.2018


Ответы (1)


Вместо того, чтобы пытаться делать все в конструкторе, я продемонстрирую предпочтительный способ использования try-with-resources и вызову другого метода. А именно, передать ресурс closeable другому методу. Но я настоятельно рекомендую возложить ответственность за их закрытие на открывателя таких ресурсов. Нравиться,

public void writeToFile(String filePath) {
    try (PrintWriter outFile = new PrintWriter(filePath)) {
        generateReport(outFile);
    } catch (FileNotFoundException e) {
        System.out.println("File not found");
        e.printStackTrace();
    }
}

private void generateReport(PrintWriter outFile) {
    outFile.print("Hello world");
}
person Elliott Frisch    schedule 05.11.2018
comment
Да, это то, что я в итоге сделал. Спасибо за объяснение - person doctopus; 05.11.2018