Назад к спине Сканер пытается использовать ресурсы, предоставляющие исключение [дубликат]

Кажется, я знаю, почему вы хотите этого избежать. Но, возможно, попробуйте & amp; catch! == try & amp; поймать. o) Это пришло мне в голову:

var json_verify = function(s){ try { JSON.parse(s); return true; } catch (e) { return false; }};

Таким образом, вы можете также использовать грязный клип для объекта JSON, например:

JSON.verify = function(s){ try { JSON.parse(s); return true; } catch (e) { return false; }};

. По мере того, как это было как можно скорее, оно может не прерываться при ошибке.

23
задан JavaNewbie_M107 3 January 2013 в 18:21
поделиться

5 ответов

Один из вариантов заключается в том, чтобы обернуть поток System.in в CloseShieldInputStream, который предотвращает его закрытие. Ваш читатель затем использовал бы CloseShieldInputStream, а не поток raw System.in.

Вот API для класса: http://commons.apache.org/io/apidocs/ орг / апач / Обще / IO / вход / CloseShieldInputStream.html

17
ответ дан Tiny 18 August 2018 в 03:10
поделиться
  • 1
    вы также можете создать свою собственную не-закрываемую оболочку для потока System.in – paul jerman 3 January 2013 в 18:33

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

static String input() {
    try {
        return new Scanner(System.in).nextLine();
    } catch (NoSuchElementException e) {
        throw e;
    }
}

По какой-то причине это работает без предупреждений, тогда как если я не сделаю бросок catch, Eclipse будет жаловаться Resource leak: '<unassigned Closeable value>' is never closed.

0
ответ дан Blrp 18 August 2018 в 03:10
поделиться
  • 1
    Вы просто избегаете предупреждения, путая анализ кода Eclipse здесь :) Сканер по-прежнему никогда не закрывается (не то, что вам нужно :)) – john16384 28 February 2017 в 09:44

Вместо добавления классов щита и тому подобного, просто поместите хороший комментарий и

        @SuppressWarnings("resource")

. Это достаточно хорошо. И я, похоже, не вижу много недостатков в этом подходе. Не забывайте комментарий.

6
ответ дан mist 18 August 2018 в 03:10
поделиться

Самое простое - не закрывать сканер, если вы не хотите закрывать базовый поток.

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

19
ответ дан Peter Lawrey 18 August 2018 в 03:10
поделиться
  • 1
    Это работает, требуя кода, чтобы ЗНАТЬ, что он разговаривает с системой или, по крайней мере, что-то, что не должно быть закрыто. Рекомендация Paul Jermans из CloseShieldInputStream позволяет коду игнорировать этот факт и просто рассматривать его, как и любой другой InputStream, и пытаться закрыть его по завершении. То, что здесь просто, действительно зависит от контекста. – candied_orange 26 November 2016 в 19:07
  • 2
    – Andy Turner 12 October 2018 в 06:55
  • 3
    – candied_orange 12 October 2018 в 13:43

В соответствии с API для InputSteam «Метод закрытия InputStream ничего не делает», поэтому, поскольку System.in является экземпляром InputStream, вам не нужно беспокоиться о том, что close () является вызвал его.

-5
ответ дан Ted McLeod 18 August 2018 в 03:10
поделиться
  • 1
    Ясно, что это не так. Если я открою Scanner на System.in, закройте его, а затем откройте другой, а затем попытайтесь использовать его (например, nextLine()), я получаю NoSuchElementException. – Blrp 6 November 2015 в 19:17
  • 2
    Хотя close() действительно ничего не делает в реализации абстрактного InputStream по умолчанию, это не означает, что это верно для всех его подклассов! Если бы это было так, то метод был бы бесполезен. – Jiri Tousek 8 January 2016 в 17:27
  • 3
    InputStream - абстрактный класс. Подклассы могут и должны «делать что-то». когда они представляют ресурс (например, stdin), который должен быть закрыт после использования. Конечно, это можно было бы уточнить в InputStream.close(), но ваш вывод неверен. – dimo414 26 February 2016 в 19:51
Другие вопросы по тегам:

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