Как завершить программу 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 вместо числа?
- Вопрос задан более двух лет назад
- 3271 просмотр
Комментировать
Решения вопроса 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 и т.д.
System.exit()
Метод System.exit() используется в языке Java для завершения программы. Этот метод на вход принимает значение типа int . Обычно это 0, что говорит о том, что программа завершается без ошибок. Любое другое значение говорит о том, что программа завершилась с ошибкой.
public class SysExit < public static void main(String[] args) < System.out.println("Дo возврата."); method(true); System.out.println("Этот оператор выполняться не будет."); >public static void method(boolean flag) < if (flag) < System.exit(0); >System.out.println("Этот оператор метода выполняться не будет."); > >
Результат выполнения программы:
Дo возврата.
Презентацию с видео можно скачать на Patreon .
Как остановить выполнение программы java
Прервать выполнение программы можно вызвав System.exit() .
Передав в качестве аргумента 0, мы дадим команду на завершение без ошибки. А передав любое ненулевое число N — команду на завершение с ошибкой номер N :
System.exit(0); // завершение без ошибки System.exit(1); // завершение c ошибкой 1
Вызов return из головного метода main также приведет к завершению программы.
Как завершить программу в 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) не работает.
