终止Java程序


79

我找到了终止(关闭或停止)Java程序的方法。我找到了两个解决方案。

  1. 使用return;
    当我想退出或终止程序执行时,添加它。

  2. 使用System.exit() ;
    有时我用它。我从This Question中了解了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没有任何变量或值,这很奇怪)?



Answers:


100

调用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退出)。您的OS或Shell可以读取在System.exit()方法中传递回的整数。0表示“程序已退出并且一切正常”是标准的,其他任何值通知发生错误。由开发人员决定是否为所有用户记录这些返回值。

return另一方面,是编译器熟知的保留关键字。 return返回一个值,并结束当前函数的运行,将其移回堆栈,移至调用它的函数(如果有)。在上面的代码中,它返回了,void因为您没有提供任何返回的信息。


2
它真的回来了null吗?没有什么比虚无的了吗?您不能null使用返回类型为的方法返回void
Keerthivasan 2014年

您是正确的,我将更改答案。感谢您指出错误。
2014年

7

System.exit()终止JVM。执行System.exit()之后什么都没有。Return通常用于退出方法。如果返回类型为void,则可以使用return; 但是我认为在主要方法中这样做不是一个好习惯。除非无限循环或一些其他奇怪的执行流程,否则不必执行任何操作来终止程序。


6

因此返回;并不会真正终止您的Java程序它只会终止您的Java函数(void)。因为在您的情况下,该功能是应用程序的主要功能,所以返回;也将终止该应用程序。但是回报;在您的示例中是没有用的,因为无论如何该函数将在此返回之后立即终止...

System.exit()的会完全地终止你的程序,它会关闭所有打开的窗口。


4

什么返回?意思?

return;真的意味着它什么也不返回void。而已。

为什么返回 或其他代码可以写在System.exit(0)的语句下面;

由于编译器不知道调用System.exit(0)会终止,因此允许这样做JVM。编译器只会发出警告-不必要的return语句


4
  • 好吧,首先使用System.exit(0)终止程序,尽管编译器不会引发任何错误,但下面的语句不正确。
  • return;void返回类型的方法中使用了plain ,将执行控制返回到其父方法。

真奇怪。我曾希望编译器抛出“无法访问的代码”错误。
user3932000

编译器不知道System.exit(0)的功能(也不应该做出这样的假设,因为从技术上讲,您可以做一些ClassLoader魔术来加载不会导致退出的System.exit()的不同实现) ),
David Liu

是的,我想你是对的。也许警告是有道理的。
anirudh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.