4

有什么方法可以退出该方法吗?听说有两种退出方式。

一:抛出异常。

public void dosomething() {
    if(...) {
        throw new MyException();
    }
             // there might be another process.

}

二:返回一些值。即使是 void 方法,我们也可以返回值。

public void dosomething() {
    if(...) {
        return;
    }
             // there might be another process.
}

问题是,有没有更好的方法?

4

4 回答 4

3

从技术上讲,您可以System.exit(int)(int 值将是从进程返回的值,并且可能非零表示错误)。然而,这有点残酷。

你也可以打断自己。

Thread.currentThread().interrupt();

然而:

  1. 这仍然是一个例外。你没有明确地抛出它,但它仍然会导致InterruptedException
  2. 您的线程必须随后执行一些 IO/睡眠操作才能注册此中断。如果它只是计算性的,那么它不会因此而退出。

例如(注意sleep()捕捉中断):

public class Test {
  public static void method() throws Exception {
    Thread.currentThread().interrupt();
    Thread.sleep(100);
    System.out.println("method done");
  }
  public static void main(String[] args) throws Exception {
    method();
    System.out.println("done");
  }
}

给我:

Exception in thread "main" java.lang.InterruptedException: sleep interrupted
        at java.lang.Thread.sleep(Native Method)
        at T.method(T.java:5)
        at T.main(T.java:9)
于 2012-11-15T10:17:12.433 回答
1

还有第三种虽然不是很有用的方法:

System.exit(0);

如果您出于学术目的问这个问题......

您抛出异常的事实并不一定意味着您正在退出该方法。例如,如果您这样做:

try {
    throw  new Exception();
    // ...
} catch (Exception e) {
    // ...
}

你不会退出该方法。

此外,如果您正在调用一个void方法,它将在方法主体中的最后一条语句之后退出(隐式)。

于 2012-11-15T10:17:31.730 回答
1

您可以使用

Thread.currentThread().stop();

它将终止当前线程而不停止整个 JVM。

stop()方法已被弃用并且本质上是不安全的。从规范:

这种方法本质上是不安全的。使用 Thread.stop 停止线程会导致它解锁所有已锁定的监视器(这是未经检查的 ThreadDeath 异常沿堆栈传播的自然结果)。如果以前受这些监视器保护的任何对象处于不一致状态,则损坏的对象将对其他线程可见,从而可能导致任意行为。

因此,如果您需要退出某个方法并且不能return或抛出异常,请让该方法在其自己的线程中运行,并在必要时终止该线程。请注意,这不是标准程序,而是更多的 hack。

于 2012-11-15T10:23:27.873 回答
0

这也可以考虑?

  public void test(){
             System.out.println("Do My work");
             String s = null;
             s.length();
             System.out.println("Do My  other work");

    }
于 2012-11-15T10:29:12.583 回答