Кажется, я знаю, почему вы хотите этого избежать. Но, возможно, попробуйте & 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; }};
. По мере того, как это было как можно скорее, оно может не прерываться при ошибке.
Один из вариантов заключается в том, чтобы обернуть поток System.in
в CloseShieldInputStream
, который предотвращает его закрытие. Ваш читатель затем использовал бы CloseShieldInputStream
, а не поток raw System.in
.
Вот API для класса: http://commons.apache.org/io/apidocs/ орг / апач / Обще / IO / вход / CloseShieldInputStream.html
У меня смутные воспоминания о странных, неразрешимых проблемах давно с использованием того же 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
.
Вместо добавления классов щита и тому подобного, просто поместите хороший комментарий и
@SuppressWarnings("resource")
. Это достаточно хорошо. И я, похоже, не вижу много недостатков в этом подходе. Не забывайте комментарий.
Самое простое - не закрывать сканер, если вы не хотите закрывать базовый поток.
В идеале вы должны создать только один сканер, который вы используете для жизни программы. В любом случае, похоже, у вас нет веских причин закрыть его.
CloseShieldInputStream
позволяет коду игнорировать этот факт и просто рассматривать его, как и любой другой InputStream, и пытаться закрыть его по завершении. То, что здесь просто, действительно зависит от контекста.
– candied_orange
26 November 2016 в 19:07
В соответствии с API для InputSteam «Метод закрытия InputStream ничего не делает», поэтому, поскольку System.in является экземпляром InputStream, вам не нужно беспокоиться о том, что close () является вызвал его.
Scanner
на System.in
, закройте его, а затем откройте другой, а затем попытайтесь использовать его (например, nextLine()
), я получаю NoSuchElementException
.
– Blrp
6 November 2015 в 19:17
close()
действительно ничего не делает в реализации абстрактного InputStream
по умолчанию, это не означает, что это верно для всех его подклассов! Если бы это было так, то метод был бы бесполезен.
– Jiri Tousek
8 January 2016 в 17:27
InputStream
- абстрактный класс. Подклассы могут и должны «делать что-то». когда они представляют ресурс (например, stdin), который должен быть закрыт после использования. Конечно, это можно было бы уточнить в InputStream.close()
, но ваш вывод неверен.
– dimo414
26 February 2016 в 19:51