Как завершить программу Java при вводе пользователем символа q в любом месте программы?
Задача заключается в написании простенького калькулятора (число-операция-число-результат). Программа должна работать бесконечно, если пользователь вводит корректные данные, но если пользователь вводит букву q то программа должна завершиться (именно завершиться, а не уведомить об ошибке). Вот что у меня пока есть:
public static void main(String[] args) < Scanner sc = new Scanner(System.in); do < System.out.println("Введите число"); int a = sc.nextInt(); sc.nextLine(); System.out.println("Введите операцию"); String s = sc.nextLine(); System.out.println("Введите число"); int b = sc.nextInt(); if (s.equals("+")) < int res = 0; res = a + b; System.out.println(res); >char c = s.charAt(0); if (c == ('q')) break; > while(true);
Сейчас это работает если вместо математического знака ввести q. Но как мне сделать так, чтобы программа завершалась если пользователь введет q вместо числа?
- Вопрос задан более двух лет назад
- 3261 просмотр
Комментировать
Решения вопроса 1
Орхан Гасанлы @azerphoenix Куратор тега Java
Java Software Engineer
if (c == ('q')) break;
тут используйте не break, а System.exit(0);
https://www.tutorialspoint.com/java/lang/system_ex.
Ответ написан более двух лет назад
JennyK @JennyK Автор вопроса
Хорошо, правда не очень понимаю разницу между System.exit(0); и break; (я совсем новичок).
И это все равно не решает проблемы: «Но как мне сделать так, чтобы программа завершалась если пользователь введет q вместо ЧИСЛА?»

Орхан Гасанлы @azerphoenix Куратор тега Java
Хорошо, правда не очень понимаю разницу между System.exit(0); и break; (я совсем новичок).
System.exit(0); используется для выхода из программы.
break; используется для выхода из цикла или например, из конструкции switch case
continue; используется для завершения (пропуска) текущей итерации цикла и продолжения цикла
Тут следующий момент, так как конструкция if у вас находится в конце, то пользователь не может выйти из любой точки программы, т.е. он должен ввести 2 числа и операнд, чтобы потом можно было ввести «q» и выйти из программы.
Соответственно, конструкцию if нужно перекинуть вверх.
Вот, ваш код (прокомментировал его):
public static void main(String[] args) < Scanner sc = new Scanner(System.in); /* * Если например, я хочу выйти из программы сразу же после запуска, то при вводе q * будет выброшено исключение, так как на вход я ожидается число (nexInt) * */ do < System.out.println("Введите число"); int a = sc.nextInt(); sc.nextLine(); System.out.println("Введите операцию"); String s = sc.nextLine(); System.out.println("Введите число"); int b = sc.nextInt(); if (s.equals("+")) < int res = 0; res = a + b; System.out.println(res); >// Сюда не доходит даже char c = s.charAt(0); if (c == ('q')) < System.exit(0); >> while (true); >
Напишу простой вариант реализации, а вы изучите и посмотрите на преимущества и недостатки.
public class Main < public static void main(String[] args) < Scanner sc = new Scanner(System.in); do < System.out.println("Введите первое число:"); int a = sc.nextInt(); sc.nextLine(); System.out.println("Введите операцию:"); char operator = sc.nextLine().charAt(0); System.out.println("Введите второе число:"); int b = sc.nextInt(); int result = 0; if (operator == '+') < result = a + b; >else if (operator == '-') < result = a - b; >else if (operator == '*') < result = a * b; >else if (operator == '/') < result = a / b; >System.out.println("Результат: " + result); sc.nextLine(); System.out.println("Для выхода из программы введите - q"); char c = sc.nextLine().charAt(0); if (c == ('q')) < System.exit(0); >> while (true); > >
Конечно же нужно будет обработать ошибки. Можно заменить if else if на switch case и т.д.
Корректный выход из программы
Попался мне один код со следующим механизмом: Один из методов с названием printResults принимает на вход лист строк. В методе проверка — если список пустой, то System.exit(0); Если нет, то в цикле выводятся строки в консоль.
Мне кажется, это некорректно и неуместно, и System.exit(0); не предназначен для подобного. Считаю, что тут нужно использовать обработку исключения. Поправьте меня, если я не прав.
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Корректный выход из программы
Добрый день! Есть кусок кода, который проверяет введенную строку в формате xml на соответствие.
Корректный выход
Доброго времени суток! Пытаюсь разобраться с fork(), а точнее с корректным выходом из fork’нутого.
Корректный выход из приложения
Привет, при нажатии на кнопку моя программа должна закрыться, пишу так: PostQuitMessage(0); Но.

Корректный выход из приложения
Проблема в том, что не могу сделать корректный выход из приложении. Как есть. Системная кнопка.
![]()
3638 / 2970 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
Нужно — используй, не нужно — не используй, все же очевидно
Регистрация: 19.09.2016
Сообщений: 1,064
Причем тут нужно/не нужно?? Вопрос же явно обозначен- конкретный случай и уместно ли в нем использование system.exit().
В автомобиле тоже есть традиционный тормоз и ручник. И в том и в том случае автомобиль остановится, даже без остановки двигателя. Вопрос , насколько это корректно. Шуруп можно забить молотком. Примеров много.
Я почитал про system.exit и однозначного ответа на свой вопрос в контексте не нашел. Во первых, нулевой код означает благополучное завершение программы. В нашем же случае — получение null в результате проверки, при этом еще и выводится сообщение в консоль о том, что завершение программы из за возникшей проблемы.
Зачем тогда вообще нужен механизм исключений?
Кроме этого, насколько я понял, что system.exit уместно, когда например нет возможности вернуться туда откуда вызывали например через return, например в главном методе main. Или при использовании потоков.
Добавлено через 13 минут
Для более предметного разговора:
1 2 3 4 5 6 7 8 9
private void printResults(ArrayListString> getData) { if (getData == null) { println("Nothing to print!"); System.exit(0); } for (String string : getData) { println(string); } }
Метод вызывается из главного метода main
Добавлено через 5 минут
Вот еще по этому же вопросу:
It’s a good practice to use exception handling or plain return statements to exit a program when working with application servers and other regular applications. Usage of System.exit method suit better for script-based applications or wherever the status codes are interpreted.
Принудительное завершение работы приложения на компьютере Mac
Если приложение не отвечает и вы не можете выйти из него обычным способом, выполните следующие действия, чтобы принудительно завершить работу приложения.
Чтобы завершить работу приложения на компьютере Mac обычным способом, выберите пункт «Завершить» из меню приложения в строке меню или нажмите клавиши Command-Q. Если приложение не закрывается, выполните следующие действия для принудительного завершения работы.
Принудительное завершение работы приложения
Одновременно нажмите три следующих клавиши: Option (или Alt), Command и Esc (Escape) 1 . Или выберите «Завершить принудительно» из меню Apple в углу экрана.
Откроется окно принудительного завершения работы. Выберите приложение, работу которого вы хотите завершить, затем щелкните «Завершить».
Приложение Finder открыто всегда, но если оно перестанет отвечать, вы можете принудительно завершить его работу, а затем открыть это приложение снова. Для этого выберите Finder в окне принудительного завершения, а затем щелкните «Перезапустить». Узнайте, как закрыть приложение на iPhone или iPad.
Если вы не можете принудительно завершить работу приложения
- Нажмите и удерживайте кнопку питания компьютера Mac в течение 10 секунд, пока он не выключится 2 .
- Снова включите компьютер Mac.
1. Даже у компьютеров с панелью Touch Bar есть клавиша Esc. Она находится в левой части панели Touch Bar.
2. На каждом компьютере Mac есть кнопка питания. На ноутбуках Mac кнопка питания находится в правом верхнем углу клавиатуры. Если на клавиатуре ноутбука есть датчик Touch ID, клавиша с этим датчиком также является и кнопкой питания.
Как завершить программу java
1. Здесь обсуждается Java , а не JavaScript ! Огромная просьба, по вопросам, связанным с JavaScript, SSI и им подобным обращаться в раздел WWW Masters или, на крайний случай, в Многошум.
2. В случае, если у вас возникают сомнения, в каком разделе следует задать свой вопрос, помещайте его в корневую ветку форума Java . В случае необходимости, он будет перемещен модераторами (с сохранением ссылки в корневом разделе).
3. Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.
4. Не рекомендуется создавать несколько несвязанных вопросов в одной теме. Пожалуйста, создавайте по одной теме на вопрос.
Модераторы: dark_barker, wind
‘> Как завершить программу путём нажатия кнопки на главной форме?
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
Сообщ. #1 , 08.10.08, 10:22
Full Member
Рейтинг (т): нет
У программы есть главная форма и есть вызываемый диалог rsm. На главной форме есть кнопка jButton, при нажатии на которую проиходят некоторые действия (вызов функции ReadAndWrite и показ диалога rsm). Как мне в обработке нажатия этой кнопки, после закрытия диалога rsm, завершаить работу программы? Какую функцию для этого надо использовать?
private JButton getJButton() <
if (jButton == null) <
jButton = new JButton();
jButton.setBounds(new Rectangle(74, 45, 75, 16));
jButton.setText("OK");
jButton.addMouseListener(new java.awt.event.MouseAdapter() <
public void mouseClicked(java.awt.event.MouseEvent e) <
//System.out.println("mouseClicked()"); // TODO Auto-generated Event stub mouseClicked()
ReadAndWrite();
Resume rsm = new Resume(null);
rsm.setVisible(true);
> catch (IOException ex) <
return jButton;
Сообщ. #2 , 08.10.08, 10:35
Рейтинг (т): 10
System.exit(0);
Сообщ. #3 , 08.10.08, 10:38
Senior Member
Рейтинг (т): 71
У фрейма defaultCloseOperation = EXIT_ON_CLOSE
Сообщ. #4 , 08.10.08, 12:32
Full Member
Рейтинг (т): 25
Цитата t3hnar @ 08.10.08, 10:35
System.exit(0);
Это аналог рубильника. Лучше так не делать
Цитата erslgoeirjh @ 08.10.08, 10:22
Какую функцию для этого надо использовать?
ui-ный поток можно прекратить, вызвав Frame.dispose() у всех живых фреймов и диалогов
Сообщ. #5 , 09.10.08, 09:52
Рейтинг (т): 82
Цитата Grab[SSAU] @ 08.10.08, 12:32
ui-ный поток можно прекратить, вызвав Frame.dispose() у всех живых фреймов и диалогов
О, да, а это не рубильник наверно, а вежливое «вы уже уходите?». Вы несколько заблуждаетесь
Сообщ. #6 , 09.10.08, 10:05
Full Member
Рейтинг (т): 25
Цитата dark_barker @ 09.10.08, 09:52
О, да, а это не рубильник наверно, а вежливое «вы уже уходите?»
ну я несколько иное имел в виду.
Да, это тоже рубильник, но он прекратит работу только графической части, давая возможность при необходимости нормально завершиться другим слоям, например, освободив ресурсы.
А System.exit(0) — вообще все прекратит мгновенно.
Сообщ. #7 , 09.10.08, 10:42
Рейтинг (т): 82
Цитата Grab[SSAU] @ 09.10.08, 10:05
А System.exit(0) — вообще все прекратит мгновенно.
Конечно же, это не так
Сообщ. #8 , 09.10.08, 10:55
Full Member
Рейтинг (т): 25
Цитата dark_barker @ 09.10.08, 10:42
Конечно же, это не так
? расскажите, может я чего не так понимаю?
Сообщ. #9 , 09.10.08, 11:10
Рейтинг (т): 82
VM всегда завершает свою работу одним из двух способов:
нормальный, из программы: System.exit / когда завершаются все не-демон-потоки.
ненормальный: насильно сняли саму виртуальную машину извне.
В нормальном выходе ВСЕГДА выполняются некие действия, это не совсем kill всей машины безоговорочный. Как минимум, можно поставить shutdown-ловушки, которые обязательно обязаны завершится прежде чем завершится программа.
Добавлено 09.10.08, 11:13
Цитата Grab[SSAU] @ 09.10.08, 10:05
Да, это тоже рубильник, но он прекратит работу только графической части, давая возможность при необходимости нормально завершиться другим слоям, например, освободив ресурсы.
И с другой стороны — если логика завязана на UI-потоках (как это и делается обычно) — то чем же отличается завершение потока графической части? Весь вопрос в реализации ведь. И так и так можно сделать. Я может немного категорично инициировал спор, но я хотел сказать, что, в приницпе, в System.exit(0) ничего страшного нет при правильном подходе.
Сообщ. #10 , 09.10.08, 11:19
Full Member
Рейтинг (т): 25
Цитата Grab[SSAU] @ 09.10.08, 10:55
И с другой стороны — если логика завязана на UI-потоках (как это и делается обычно) — то чем же отличается завершение потока графической части?
ну. вроде как принято разбивать на слои
Цитата dark_barker @ 09.10.08, 11:10
В нормальном выходе ВСЕГДА выполняются некие действия, это не совсем kill всей машины безоговорочный. Как минимум, можно поставить shutdown-ловушки, которые обязательно обязаны завершится прежде чем завершится программа.
если честно, то не проверял. Но блок finally при System.exit(0) не работает.
