【问题标题】:Query related to Exception handling异常处理相关查询
【发布时间】: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


【解决方案1】:

您的问题出在 Java catch 块中。 Exception 不是所有可能错误的超类; Throwable 是。 StackOverflowError 扩展了 Error,而不是 Exception,所以没有被抓住。最好捕获StackOverflowError 本身,但也可以捕获VirtualMachineErrorErrorThrowable

【讨论】:

  • 我真的错过了它实际上是一见钟情。你还能指出两种语言输出的差异吗?
  • @joeyrohan 我对 C# 一无所知,所以我不能说什么,但堆栈内部的工作方式有所不同。
  • @bcsb1001 抱歉,我完全改变了我的问题,但我的查询与堆栈的内部工作有关,但我感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
  • 2020-12-30
  • 2021-04-23
  • 1970-01-01
相关资源
最近更新 更多