Припинення роботи програми Java


80

Я знайшов способи припинити (зупинити або зупинити) мої програми Java. Я знайшов два рішення для цього.

  1. використовуючи return;
    Коли я хочу залишити або припинити виконання програми, я додаю це.

  2. за допомогою System.exit () ;
    Іноді я цим користувався. Я читав про Sytem.exit () з цього запитання .

Отже, я трохи знаю про них обох. Але мене все ще бентежить, як вони насправді працюють. Будь ласка, перевірте коди нижче ...

public class Testing {

public static void main(String... str) {
    System.out.println(1);
    System.exit(0);
    System.out.println(2);
    return;
 }
}

Я впевнений, що 2 не з’являться. Я хотів би знати, чому return;чи інші коди можуть писати нижче твердження System.exit(0);і для чого було справжнім визначенням return;( адже це дивно для мене returnбез будь-яких змінних чи значень )?


можливий дублікат stackoverflow.com/questions/11487184/…
RKC

Відповіді:


101

Виклик System.exit(0)(або будь-яке інше значення) призводить до виходу віртуальної машини Java, що завершує поточний процес. Переданим параметром буде значення повернення, яке javaпроцес поверне в операційну систему. Ви можете зробити цей дзвінок з будь-якої точки вашої програми - і результат завжди буде однаковим - JVM припиняє свою роботу. Оскільки це просто виклик статичного методу в Systemкласі, компілятор не знає, що він буде робити - і, отже, не скаржиться на недосяжний код.

returnоператор просто перериває виконання поточного методу. Це буквально означає повернення елемента керування до виклику методу . Якщо метод оголошено як void(як у вашому прикладі), тоді вам не потрібно вказувати значення, оскільки вам потрібно буде повернути void. Якщо метод оголошено для повернення певного типу, тоді ви повинні вказати значення, яке повертається - і це значення має бути вказаного типу.

returnпризведе до виходу програми, лише якщо вона знаходиться всередині mainметоду основного класу, який виконується. Якщо ви спробуєте поставити код після нього, компілятор скаржиться на недосяжний код, наприклад:

public static void main(String... str) {
    System.out.println(1);
    return;
    System.out.println(2);
    System.exit(0);
}

не компілюється з більшістю компіляторів - видаючи unreachable codeпомилку, що вказує на другий System.out.printlnвиклик.


14
  1. System.exit () - це метод, який призводить до виходу JVM.
  2. return просто повертає елемент керування функції виклику.
  3. return 8 поверне керування та значення 8 до методу виклику.

11

Тому що System.exit()це просто ще один метод для компілятора. Він не читає заздалегідь і не з’ясовує, що вся програма завершить роботу в цей момент (JVM припиняє роботу). Ваша ОС або оболонка може прочитати ціле число, яке передається назад у System.exit()методі. Стандартно 0означає "завершення роботи програми, і все пройшло нормально", а також будь-яке інше значення для повідомлення про помилку. Розробник повинен задокументувати ці повернені значення для будь-яких користувачів.

returnз іншого боку - зарезервоване ключове слово, яке компілятор добре знає. returnповертає значення і закінчує цикл поточної функції, повертаючись назад у стек до функції, яка його викликала (якщо така є). У наведеному вище коді він повертається, voidоскільки ви не вказали нічого для повернення.


2
Це справді повертається null? Хіба це ніщо так пусте? Ви не можете повернути nullметод із типом повернення як void.
Keerthivasan

Ви праві, я зміню свою відповідь. Дякуємо, що вказали на помилку.
неподільний

7

System.exit () завершує роботу JVM. Після виконання System.exit () нічого не виконується. Повернення зазвичай використовується для виходу з методу. Якщо тип повернення порожній, тоді ви можете використовувати return; Але я не думаю, що це хороша практика робити це основним методом. Вам не потрібно нічого робити для завершення програми, якщо тільки не протікає нескінченний цикл або якісь інші дивні виконання.


6

Тож повертайся; насправді не припиняє вашу програму Java , вона лише припиняє вашу функцію Java (void) . Оскільки у вашому випадку функція є основною функцією вашої програми, return; також розірве заявку. Але повернення; у вашому прикладі марно, оскільки функція все одно завершиться безпосередньо після цього повернення ...

System.exit () буде укомплектувати припинити свою програму , і вона буде закривати всі відкриті вікна.


4

Що повертається; маю на увазі?

return;насправді означає, що нічого не повертає void. Це воно.

навіщо повертатися; або інші коди можна записати нижче твердження System.exit (0);

Це дозволено, оскільки компілятор не знає, що виклик System.exit(0)припинить JVM. Компілятор просто дасть попередження - непотрібний оператор повернення


4
  • Ну, спочатку System.exit (0) використовується для завершення роботи програми, а наведені нижче інструкції неправильні, хоча компілятор не видає помилок.
  • plain return;використовується у методі void type return, щоб повернути контроль виконання батьківському методу.

Це справді дивно. Я очікував, що компілятор видасть помилку "Недосяжний код".
user3932000

Компілятор не знає, що робить System.exit (0) (і не повинен робити такого припущення, оскільки технічно ви можете зробити деяку магію ClassLoader, щоб завантажити іншу реалізацію System.exit (), яка не спричиняє вихід ),
Девід Лю

Так, мабуть, ти маєш рацію. Можливо, попередження мало б сенс.
anirudh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.