Как закрыть сканер в java
Перейти к содержимому

Как закрыть сканер в java

  • автор:

Java — закрытие сканера и утечка ресурсов

Я изучаю Java и работаю над некоторыми проектами для удовольствия. Одна из проблем, с которой я столкнулся, заключается в том, что когда я использую объект Scanner , Eclipse предупреждает меня, что:

Утечка ресурсов: «сканирование» никогда не закрывается.

Итак, я добавил scan.close(); в конце моего кода и заботится о предупреждении. Проблема возникает из-за того, что у меня есть другие классы в одном пакете, которые также используют объекты сканера, а Eclipse сообщает мне закрыть сканер в этих классах соответственно. Однако, когда я делаю это, похоже, что он закрывает ВСЕ объекты сканера, и я получаю ошибки во время выполнения. Вот пример того, что вызывает ошибку:

import java.util.Scanner; public class test2 < public static void main(String [] args) < Scanner scan = new Scanner(System.in); int test = 0; do < //Do stuff test = scan.nextInt(); System.out.println(test); scanTest scanTest = new scanTest(); scanTest.test(); >while (test != 0); scan.close(); > > import java.util.Scanner; public class scanTest < public void test() < Scanner scanner = new Scanner(System.in); int blah = scanner.nextInt(); System.out.println(blah); scanner.close(); >> 

После того, как сканер закрыт в классе scanTest , а цикл do в test2 снова введен, в строке test = scan.nextInt(); Я попытался переместить создание объекта сканера в цикл do только для создания нового объекта каждый раз, но ошибка все еще происходит. Не знаю, почему это происходит или как я могу убедиться, что все объекты ввода-вывода закрыты без проблем. В одном сообщении, которое я встретил, упоминалось, что когда System.in закрыто, я не могу снова открыть. Если это так, мне просто нужно убедиться, что объект сканера с System.in закрыт в самом конце программы и @suppress все другие предупреждения сканера в других классах? Или это все равно оставит все эти объекты сканера открытыми (плохими)?

Как закрыть сканер в java

В Java считать символ с клавиатуры можно с помощью класса `Scanner`. Однако, по умолчанию `Scanner` не имеет метода для чтения отдельного символа. Вместо этого, вы можете сначала считать строку с помощью `Scanner.nextLine()`, а затем использовать метод `charAt()` для получения символа по индексу. Вот пример:

 ```java import java.util.Scanner; public class Main < public static void main(String[] args) < Scanner scanner = new Scanner(System.in); System.out.print("Введите символ: "); String input = scanner.nextLine(); if (!input.isEmpty()) < char symbol = input.charAt(0); System.out.println("Считанный символ: " + symbol); >else < System.out.println("Строка пустая."); >> > ``` 

Этот код запрашивает у пользователя ввод символа с клавиатуры, считывает введенную строку, а затем использует метод `charAt(0)` для получения первого символа из этой строки. ну что за костыли!

26 февраля 2024

Эмм, как бы никого не смущает, что вы использовали в цикле while метод next(), я ожидал увидеть там один из изученных ранее методов, а так как работаем со строками, то ожидал увидеть nextLine(). Про next() не было ни слова сказано, я даже не знал, что его можно использовать

Как очистить буфер сканера в Java?

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

Óscar López 15 май 2012, в 17:02
Поделиться

in.nextLine(); 

Это ускоряет сканирование до следующей строки.

Makoto 15 май 2012, в 15:59
Поделиться
Иногда вводится несколько строк, это работает только для одной строки.
Leo Jiang 15 май 2012, в 20:39
Сделайте это за столько строк, сколько введено.
m0skit0 16 май 2012, в 03:16

Можно подумать, что hasNextLine (или hasNext) можно использовать для проверки доступности дополнительных входных данных, но в Java это не работает. Методы hasNextLine / hasNext всегда возвращают true для клавиатуры (System.in). Единственный способ очистить все буферизованные данные без блокировки — открыть новый сканер: in.close (); in = новый сканер (System.in);

Georgie 13 янв. 2018, в 23:12

@Georgie Georgie Вы хотели бы создать новый сканер, не закрывая старый. Закрытие сканера также закрывает основной читаемый объект (в нашем случае System.in), поэтому я получаю NoSuchElementExceptions при следующем вызове Scanner.next (), если я закрою сканер System.in и создам другой. Если вам действительно нужно закрыть старый, этот ответ StackOverflow предполагает, что вы можете обойти это, создав оболочку для System.in, если хотите сначала закрыть ее.

SansWit 07 май 2019, в 22:23
Показать ещё 2 комментария

Используйте следующую команду:

in.nextLine(); 
System.out.println("Invalid input. Please Try Again."); System.out.println(); 

или после следующей фигурной скобки (где ваш комментарий к ней есть).

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

Надеюсь, это поможет!

Gunnar Södergren 28 авг. 2014, в 07:53
Поделиться

Это должно исправить это.

Scanner in=new Scanner(System.in); int rounds = 0; while (rounds < 1 || rounds >3) < System.out.print("How many rounds? "); if (in.hasNextInt()) < rounds = in.nextInt(); >else < System.out.println("Invalid input. Please try again."); in.next(); // -->important System.out.println(); > // Clear buffer > System.out.print(rounds+" rounds."); 

rejun 06 май 2014, в 07:43
Поделиться

Одним из решений является размещение объекта банка внутри цикла do-while в главном, чтобы каждый новый объект банка создавался.

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

static int count = 0; //don't forget to make count global and initialize public static void main(String[] args) < int Choice; //place the Acct array inside bankUser main or declare //as global bankAcct myAcct[] = new bankAcct[3]; do < //Place the bank object inside the do-while Bank myBank = new Bank(count, myAcct); //pass the variables to the //new Bank object dispMenu(); Choice = getChoice(); proChoice(Choice, myBank); >while (Choice !=0); > 

Не забудьте сделать счетчик глобальным, потому что он должен быть способен быть передан в объект в главном И добавлен в openScct с открытым ключом в методе proChoice.

case 1: myBank.openAcct(); count++; break; 

Наконец, вы можете передать массив myAcct и переменную count через объект, используя конструктор в классе банка.

public Bank(int count, bankAcct myAcct[]) < this.count = count; this.myAcct = myAcct; 

Метод close () сканера в Java с примерами

Метод close () класса java.util.Scanner закрывает открытый сканер. Если сканер уже закрыт, то при вызове этого метода он не подействует.

Синтаксис:

public void close ()

Возвращаемое значение: функция не возвращает никакого значения.

Нижеприведенные программы иллюстрируют вышеуказанную функцию:

Программа 1:

Ссылка: https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#close ()

Вниманию читателя! Не переставай учиться сейчас. Ознакомьтесь со всеми важными концепциями Java Foundation и коллекций с помощью курса "Основы Java и Java Collections" по доступной для студентов цене и будьте готовы к работе в отрасли. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *