Близко когда-либо бросает IOException?

Должно работать что-то вроде следующего:

const str = "aaa-bbb-ccc-dd"; 
const arr = srt.split("-");   
this.setState({str1 : arr[0],str2 : arr[1], str3: arr[2], str4 : arr[3]});
28
задан Danubian Sailor 9 December 2013 в 07:49
поделиться

5 ответов

Для файлов Вы не можете видеть IOException, бросаемый часто на завершение (), но Вы будете определенно видеть его для нефайлового ввода-вывода как закрытие сокетов к сети.

Вот пример из ошибки Java, где закрытие сокета UDP в конечном счете заставило IOException быть брошенным.

14
ответ дан Martin 28 November 2019 в 02:48
поделиться

Я нашел два случая:

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

Оба из тех примеров зависят от чего-то случай, в то время как существуют все еще данные в буфере. Близкие сбросы буфер перед файлом является завершениями, поэтому если существует ошибка при записи данных в файл, это бросает IOException.

, Если Вы выполняете следующий код, передающий его название файла для создания на сетевом диске, и затем перед нажатием клавиши Enter, отключают сетевой кабель, это заставит программу бросать IOException в завершение.

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class Test
{
    public static void main(final String[] argv)
    {
        final File file;

        file = new File(argv[0]);
        process(file);
    }

    private static void process(final File file)
    {
        Writer writer;

        writer = null;

        try
        {
            writer = new FileWriter(file);
            writer.write('a');
        }
        catch(final IOException ex)
        {
            System.err.println("error opening file: " + file.getAbsolutePath());
        }
        finally
        {
            if(writer != null)
            {
                try
                {
                    try
                    {
                        System.out.println("Please press enter");
                        System.in.read();
                    }
                    catch(IOException ex)
                    {
                        System.err.println("error reading from the keyboard");
                    }

                    writer.close();
                }
                catch(final IOException ex)
                {
                    System.err.println("See it can be thrown!");
                }
            }
        }
    }
}
<час>

Начиная с Java 7 можно использовать попытку с ресурсами выйти из этой путаницы (удалил явный код поколения исключения для close() операция):

private static void process(final File file) {
    try (final Writer writer = new FileWriter(file)) {
        writer.write('a');
    } catch (final IOException e) {
        // handle exception
    }
}

это автоволшебно обработает исключения в close(), и это выполняет явное null проверка внутренне.

28
ответ дан Maarten Bodewes 28 November 2019 в 02:48
поделиться

Когда это действительно происходит, это должно быть обработано как любой другой IOException, не тихо проигнорировано как Вы, посмотрите рекомендуемый так часто. Предположение, я предполагаю, что, так как Вы сделаны с помощью потока, не имеет значения, если это было очищено правильно.

Однако чистка правильно важна. Если close() операция действительно повышает исключение, его вероятное, что она включила сбрасывание некоторого вывода, фиксацию некоторой транзакции (в случае соединения с базой данных Вы думали, было только для чтения), и т.д. — определенно не что-то, что должно быть проигнорировано. И, так как это редко, Вы не ставите под угрозу надежность своего приложения значительно путем прерывания операции.

17
ответ дан erickson 28 November 2019 в 02:48
поделиться

Это конкретно FileInputStream.close, который не бросает, даже если Ваш жесткий диск горит. По-видимому, это - то же для входа сокета. Для потоков вывода можно также сбрасывать. До относительно недавно [видят, что метки времени] BufferedOutputStream раньше не удавались закрыть базовый поток, если flush бросил.

(@MaartenBodewes хотел бы, чтобы я указал, что FileInputStream.close не бросок не определяется документами API. Во время сообщения это было обычно для игнорирования пункта, упомянув, что это имело отношение к JDK Sun (теперь известный как Oracle JDK и OpenJDK). Кажется, что неясное прежнее переопределение назвало Гармонию Apache, которую раньше использовал Android, возможно, имел другое поведение. Потенциально другие реализации или версии OpenJDK, могут также бросить.)

5
ответ дан Tom Hawtin - tackline 28 November 2019 в 02:48
поделиться

Исследование того, что может произойти при вызове близко, как сокрытие исключения может влиять на Вас и что можно делать с этим: сообщение в блоге .

3
ответ дан McDowell 28 November 2019 в 02:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: