Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中生成未处理的异常中断程序_Java_C#_Exception - Fatal编程技术网

在Java中生成未处理的异常中断程序

在Java中生成未处理的异常中断程序,java,c#,exception,Java,C#,Exception,假设我们有一个位于调用堆栈深处的函数。此函数执行多个操作,并调用5个引发异常的不同函数 在C#中,我可以保留这些异常,并确保如果抛出其中任何异常,那么程序就会中断。这就是我在这里所希望的——这些异常应该停止程序。在Java中,我在编译时会出错。据我所知,我有两种选择: 处理所有这些问题并保持程序运行。但正如我所说的,我确实想破坏程序,处理所有异常可能只会把代码弄得一团糟 使函数重新显示这些异常。但是,如果我在调用堆栈中这么做,我就需要在其他级别上进行重试。这听起来真是个糟糕的设计 把事情弄清楚—

假设我们有一个位于调用堆栈深处的函数。此函数执行多个操作,并调用5个引发异常的不同函数

在C#中,我可以保留这些异常,并确保如果抛出其中任何异常,那么程序就会中断。这就是我在这里所希望的——这些异常应该停止程序。在Java中,我在编译时会出错。据我所知,我有两种选择:

  • 处理所有这些问题并保持程序运行。但正如我所说的,我确实想破坏程序,处理所有异常可能只会把代码弄得一团糟
  • 使函数重新显示这些异常。但是,如果我在调用堆栈中这么做,我就需要在其他级别上进行重试。这听起来真是个糟糕的设计
  • 把事情弄清楚——我不是说我想忽略每一个例外。它们中的许多都被记录了,等等。但在C#中,只留下一个异常并确保在程序中断时获得详细错误的功能非常方便

    在Java中我能做些什么?

    在Java中,您必须处理已检查的异常,这就是您看到错误的原因。这是由编译器强制执行的。如何处理选中的异常取决于用例

    语言一级的意图可能是,这些例外情况可以从中恢复。例如,IO API通常抛出已检查的异常

    如果希望应用程序崩溃,则需要捕获并重新抛出这些异常,或者使用
    抛出
    来声明它们。e、 g

    void doStuff(String name) throws FileNotFoundException {
      BufferedInputStream bis = new BufferedInputStream(new FileInputStream(name));
      .... do stuff
    }
    
    或者,您可以重新引发异常并将其包装为未检查的异常:

    void doStuff(String name) {
      BufferedInputStream bis;
      try {
        bis = new BufferedInputStream(new FileInputStream(name));
      } catch(FileNotFoundException e) {
        throw new RuntimeException(e); 
      }
      .... do stuff
    }
    
    但是,正如我前面所说的,这是由编译器强制执行的,因此,有另一种方法可以绕过它

    具有绕过编译器检查的
    @skillythrows
    注释。

    即使在C#中,未处理的异常也几乎总是一个坏主意。如果您不想在发生异常的函数中处理它们,那么应该将异常抛出堆栈,并且您的顶级函数应该通过调用应用程序上的exit或任何适用于您正在执行的操作的方法来处理错误。仅仅让一个异常杀死你的应用程序并不是一个很好的做法。
    void skillythrow(Throwable t)throws t{throw(t)t;}