Если вы не хотите, чтобы другая программа (которую вы вызываете с помощью основного метода) могла отключить JVM, на которой вы работаете, у вас есть, как я вижу, три варианта:
1. Использование SecurityManager
Настройте SecurityManager так, чтобы он предотвращал вызов System.exit
:
public class Test {
public static void main(String args[]) {
SecurityManager sm = System.getSecurityManager();
System.setSecurityManager(new SecurityManager() {
@Override
public void checkExit(int status) {
throw new SecurityException("Client program exited.");
}
});
try {
System.out.println("hello");
System.exit(0);
System.out.println("world");
} catch (SecurityException se) {
System.out.println(se.getMessage());
}
}
}
Печать
hello
Client program exited.
Это, наверное, самое хорошее решение. Именно так серверы приложений не позволяют произвольному сервлету завершить работу всего сервера.
2. Отдельная JVM
Запустите другую программу в отдельной JVM, используя, например, ProcessBuilder
import java.io.*;
public class Test {
public static void main(String args[]) throws IOException {
ProcessBuilder pb = new ProcessBuilder("java", "other.Program");
pb.redirectErrorStream();
Process p = pb.start();
InputStream is = p.getInputStream();
int ch;
while ((ch = is.read()) != -1)
System.out.print((char) ch);
is.close();
System.out.println("Client program done.");
}
}
3. Вместо этого используйте отключающие крюки
Не запрещайте завершение JVM, а вместо этого добавьте отключающие крюки, которые очищают "концентратор" и изящно завершают работу. (Эта опция, вероятно, имеет смысл, только если вы запускаете одну «внешнюю» программу за раз.)
import java.io.*;
public class Test {
public static void main(String args[]) throws IOException {
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
System.out.println("Uninitializing hub...");
System.out.println("Exiting gracefully.");
}
});
// Run client program
System.out.println("Running... running... running...");
System.exit(0);
}
}
Печать:
Running... running... running...
Uninitializing hub...
Exiting gracefully.