【发布时间】:2023-03-29 15:29:01
【问题描述】:
我有一些与 c# 和 java 的 异常处理 相关的代码。
作为I've read in C#,当出现StackOverflowException 时,finally 块不会被执行,因为堆栈上没有空间可以执行更多代码,并且当出现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();
}
}
输出:
显示
显示
显示
.
.
.
由于 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();
}
}
输出:
显示1
disp2
.
.
.
disp2456
句柄2455
句柄2454
.
.
线程“主”java.lang.StackOverflowError 中的异常
.
.
句柄2
句柄1
句柄0
编辑: 事实上,我的问题是代码的行为在两种语言中应该是相同的,因为如果所有堆栈空间都被填满,那么在 java JVM 中如何找到更多空间来调用 finally 块的方法?
谢谢。
【问题讨论】:
-
反对者请在cmets中说明原因。
-
虽然看起来你已经在这个问题上花费了很多精力,但它可能会受益于 2-3 行 TL;DR;有明确的单个问题的部分。
-
您的问题并不完全清楚,您要解决什么问题?或者您在询问 C# VS Java 异常处理的行为? 您能否更清楚地概述您的意图?
-
实际上我认为 c# 和 java 中的代码行为应该相同,因为 StackOverFlow 在两种语言中的行为应该相同,如果不是,两种语言中的异常处理行为如何不同?
-
您是否知道您的 Java
catch只会捕获Exceptions,而不是像StackOverflowError这样的Errors?
标签: java c# exception stack-overflow