我们知道,当虚拟机栈容量太小或者栈帧太大时,程序都会抛出StackOverflowError异常,对于StackOverflowError的处理方法,有下面两种:
- 通过try…catch(Throwable t){}来捕获,然后跟普通异常一样,对StackOverflowError进行处理
- 不捕获,然后交给JVM处理,JVM此时会中断当前线程,但是不会影响其他线程,因为虚拟机栈是每个线程私有的
下面,我们分别来模拟一下两种方法:
1.捕获StackOverflowError
public class SOFTest {
public static void main(String[] args) { new Thread(new SOFClass(),"Sub thread").start(); while (true){ System.out.println("I am main thread!"); try { Thread.sleep(1000L); } catch (InterruptedException e) { e.printStackTrace(); } } } private static class SOFClass implements Runnable{
@Override public void run() { try { recursiveMethod(); }catch (Throwable throwable){ System.out.println("捕获到了异常:"+ throwable.getClass()); } while (true){ System.out.println("I am sub thread!"); try { Thread.sleep(1000L); } catch (InterruptedException e) { e.printStackTrace(); } } } public void recursiveMethod(){ recursiveMethod(); } } } //运行结果 I am main thread! 捕获到了异常:class java.lang.StackOverflowError I am sub thread! I am main thread! I am sub thread! I am main thread! I am sub thread! I am main thread! I am sub thread!
2.JVM处理StackOverflowError
下面,我们不捕获StackOverflowError异常,当我们没有捕获时,异常就交给了JVM去处理了。
public class SOFTest { public static void main(String[] args) { new Thread(new SOFClass(),"Sub thread").start(); while (true){ System.out.println("I am main thread!"); try { Thread.sleep(1000L); } catch (InterruptedException e) { e.printStackTrace(); } } } private static class SOFClass implements Runnable{ @Override public void run() { recursiveMethod(); } public void recursiveMethod(){ recursiveMethod(); } } } //运行结果 I am main thread! Exception in thread "Sub thread" java.lang.StackOverflowError at com.arch.test.jvm.SOFTest$SOFClass.recursiveMethod(SOFTest.java:37) at com.arch.test.jvm.SOFTest$SOFClass.recursiveMethod(SOFTest.java:37) at com.arch.test.jvm.SOFTest$SOFClass.recursiveMethod(SOFTest.java:37) at com.arch.test.jvm.SOFTest$SOFClass.recursiveMethod(SOFTest.java:37) at com.arch.test.jvm.SOFTest$SOFClass.recursiveMethod(SOFTest.java:37) at com.arch.test.jvm.SOFTest$SOFClass.recursiveMethod(SOFTest.java:37) at com.arch.test.jvm.SOFTest$SOFClass.recursiveMethod(SOFTest.java:37) at com.arch.test.jvm.SOFTest$SOFClass.recursiveMethod(SOFTest.java:37) at com.arch.test.jvm.SOFTest$SOFClass.recursiveMethod(SOFTest.java:37) at com.arch.test.jvm.SOFTest$SOFClass.recursiveMethod(SOFTest.java:37) at com.arch.test.jvm.SOFTest$SOFClass.recursiveMethod(SOFTest.java:37) at com.arch.test.jvm.SOFTest$SOFClass.recursiveMethod(SOFTest.java:37) …… I am main thread! I am main thread! I am main thread! I am main thread! I am main thread! ……
我们可以看到,JVM中断了Sub thread,但是主线程仍然在运行,没有影响
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/209050.html原文链接:https://javaforall.net
