Подтвердить что ты не робот

Можно ли в конечном итоге использовать try catch?

Я использую буферизованный писатель и мой код, закрывая запись в блоке finally. Мой код выглядит следующим образом.

 ...........
    BufferedWriter theBufferedWriter = null;
    try{
    theBufferedWriter =.....
    ....
    ......
    .....
    } catch (IOException anException) {
    ....
    } finally {
        try {
            theBufferedWriter.close();              
        } catch (IOException anException) {
            anException.printStackTrace();
            }
    }

Мне нужно использовать try catch внутри очищающего кода, в конце концов, поскольку BufferedWriter может также генерировать исключение IOException. Я не хочу бросать это исключение в вызывающий метод. Хорошо ли использовать пробную попытку в конце? Если нет, то какая альтернатива? Пожалуйста, предложите.

С уважением, Hiral

4b9b3361

Ответ 1

Несколько более удобный способ сделать это - использовать IOUtils.closeQuiety из Apache Обще-ю. Он держит ваш код в порядке и устраняет некоторые из шаблонов, которые присущи Java.

Затем вы кодируете:

BufferedWriter theBufferedWriter = null;
try{
    theBufferedWriter = ...
    ...
} catch (IOException anException) {
    ...
} finally {
    IOUtils.closeQuietly(theBufferedWriter);
}

Гораздо приятнее и выразительнее.

Ответ 2

В pre Java 7 я бы сказал, что то, что вы написали, является лучшим решением.

В Java 7 и далее вы Автоматическое управление ресурсами, предназначенное для упрощения этих действий. С помощью этой функции вы можете сделать

BufferedWriter theBufferedWriter = null;
try (BufferedWriter theBufferedWriter = ...) {
....
......
.....
} catch (IOException anException) {
....
}

Ответ 3

Или вы можете использовать Lombok и @Cleanup, и вы больше никогда не будете писать попытку уловить внутри.

Так вы обычно записываете его (обратите внимание на throws IOException):

//Vanilly Java

import java.io.*;

public class CleanupExample {
  public static void main(String[] args) throws IOException {
    InputStream in = new FileInputStream(args[0]);
    try {
      OutputStream out = new FileOutputStream(args[1]);
      try {
        byte[] b = new byte[10000];
        while (true) {
          int r = in.read(b);
          if (r == -1) break;
          out.write(b, 0, r);
        }
      } finally {
        out.close();
      }
    } finally {
      in.close();
    }
  }
}

Теперь с Lombok вы просто пишете @Cleanup в потоках

import lombok.Cleanup;
import java.io.*;

 public class CleanupExample {
   public static void main(String[] args) throws IOException {
     @Cleanup InputStream in = new FileInputStream(args[0]);
     @Cleanup OutputStream out = new FileOutputStream(args[1]);
     byte[] b = new byte[10000];
     while (true) {
       int r = in.read(b);
       if (r == -1) break;
       out.write(b, 0, r);
     }
   }
 }

Ответ 4

Это то, с чем нам придется жить до Java 7 и Блоки ARM.

Ответ 5

Это нормально, но вы должны проверить, если theBufferedWriter не имеет значения null до его закрытия.
Вы также можете сделать:

BufferedWriter theBufferedWriter;
try {
    theBufferedWriter = new ...
    try {
        ...
    } finally {
        try {
            theBufferedWriter.close();
        } catch (IOException closeException) {
            closeException.printStackTrace();
        }
    }
} catch (IOException anException) {
    ...
}

или

BufferedWriter theBufferedWriter;
try {
    theBufferedWriter = new ...
} catch (IOException createException) {
    // do something with createException 
    return;  // assuming we are in a method returning void
}

try {
    ...
} catch (IOException anException) {
    ...
    // assuming we don't return here
}

try {
    theBufferedWriter.close();
} catch (IOException closeException) {
    closeException.printStackTrace();
}

но в основном я выполняю такие операции (например, запись файла) в выделенном методе и предпочитаю бросать/исключение, чтобы вызывающий мог его обработать (например, просить другой файл, останавливая приложение,...):

void someMethod(...) throws IOException {
    BufferedWriter theBufferedWriter = new ...

    try {
        ...
    } catch (IOExcepption anException) {
        try {
            theBufferedWriter.close();
        } catch (IOException closeException) {
            closeException.printStackTrace();
            // closeException is not thrown, anException represents the main/first problem
        }
        throw anException;
    }

    theBufferedWriter.close();  //  throws the Exception, if any
}

Обратите внимание: английский не мой первый или мой второй язык, любая помощь будет оценена

Ответ 6

Это нормально, чтобы положить попытку в конце. Это инструмент, который делает то, что вы хотите сделать. Тем не менее, я чувствую, что брошенное IOException при закрытии является необычным, и я разрешаю ему подавлять любое исключение в теле, как это.

try {
    BufferedWriter writer = .....
    try {
        .....
    } finally {
       writer.close();
    }
 } catch (IOException e) {
     ....
 }