我为 c#和java 异常处理提供了一些代码。
作为StackOverflowException
时,I've read in C#最终阻止将不会被执行,因为堆栈上没有空间甚至不再执行任何代码,它也不会当出现ExecutionEngineException
时会被呼叫,这可能是因为拨打Environment.FailFast()
而产生的。
在我的下面的代码( C#)中,我故意生成StackOverflowException
:
class overflow1
{
public void disp()
{
try
{
Console.WriteLine("disp");
disp();
}
catch(Exception e) {
Console.WriteLine(e);
Console.WriteLine("catch");
}
finally {
Console.WriteLine("finalyyy");
}
}
}
class ExceptionHandling
{
static void Main() {
overflow1 s = new overflow1();
s.disp();
Console.Read();
}
}
输出:
DISP
DISP
DISP
由于StackOverFlowException
,进程终止正如我所说的那样StackOverflowException
发生了,因为堆栈上没有空间甚至不再执行finally块的代码。即使catch块的方法也未被调用,可能是由于相同的原因(堆栈中没有剩余空间)。
现在我已经在 java :
中尝试了相同的代码public class ExceptionHandlingTest {
static int count1 = 0 ,count2=0;
static void disp()
{
try{
System.out.println("disp"+(++count1));
disp();
}catch(StackOverflowError e){
System.out.println(e);
System.out.println("catch");
System.exit(0);
}finally{
System.out.println("handle"+(--count1));
}
}
public static void main(String... args)
{
disp();
}
}
输出:
DISP1
DISP2
disp2456
handle2455
handle2454
线程中的异常" main" java.lang.StackOverflowError的
handle2
句柄1
handle0
修改 实际上我的问题是代码的行为应该在两种语言中都是相同的,因为如果填充了所有堆栈空间,那么java JVM中如何找到更多空间来调用最终的块方法?
感谢。
答案 0 :(得分:5)
您的问题出在Java catch
块中。 Exception
不是所有可能错误的超类; Throwable
是。 StackOverflowError
延伸Error
,而非Exception
,因此未被捕获。优先捕获StackOverflowError
本身,VirtualMachineError
,Error
或Throwable
也可以。