Java 为什么是;抛出异常“;调用函数时是否需要?

Java 为什么是;抛出异常“;调用函数时是否需要?,java,exception-handling,unhandled-exception,throws,checked-exceptions,Java,Exception Handling,Unhandled Exception,Throws,Checked Exceptions,为什么编译器报告方法show2()、show3()和main()具有 必须捕获或声明要抛出的未报告异常 当我从这些方法中删除时抛出异常 异常是一个选中的异常类。因此,任何调用声明它抛出异常的方法的代码都必须处理或声明它。在Java中,正如您所知,异常可以分为两类:一类需要抛出子句,或者如果您没有指定一个则必须处理,另一类则不需要。现在,请参见下图: 在Java中,您可以抛出任何扩展Throwable类的内容。但是,不需要为所有类指定throws子句。具体来说,是错误或运行时异常的类或这两个类的

为什么编译器报告方法
show2()
show3()
main()
具有

必须捕获或声明要抛出的未报告异常


当我从这些方法中删除
时抛出异常

异常
是一个选中的异常类。因此,任何调用声明它抛出异常的方法的代码都必须处理或声明它。

在Java中,正如您所知,异常可以分为两类:一类需要抛出子句,或者如果您没有指定一个则必须处理,另一类则不需要。现在,请参见下图:

在Java中,您可以抛出任何扩展
Throwable
类的内容。但是,不需要为所有类指定
throws
子句。具体来说,是
错误
运行时异常
的类或这两个类的任何子类。在您的情况下,
异常
不是
错误
运行时异常
的子类。因此,它是一个选中的异常,如果不处理该特定异常,则必须在
throws
子句中指定。这就是为什么需要
throws
子句的原因


发件人:

异常是在程序执行期间发生的事件,它会中断程序指令的正常流动

现在,如您所知,异常分为两类:已检查和未检查。为什么要这样分类

选中异常:它们用于表示在程序执行期间可以恢复的问题。它们通常不是程序员的错。例如,用户指定的文件不可读,或没有可用的网络连接,等等,在所有这些情况下,我们的程序不需要退出,相反,它可以采取诸如警告用户或进入回退机制(如网络不可用时脱机工作)等操作

未检查的异常:它们又可以分为两类:错误和运行时异常。不检查它们的一个原因是它们的数量很多,需要处理所有它们会使我们的程序变得混乱,降低其清晰度。另一个原因是:

  • 运行时异常:它们通常是由于程序员的错误而发生的。例如,如果出现被零除的
    算术异常
    ,或者出现
    ArrayIndexOutOfBoundsException
    异常,这是因为我们在编码时不够小心。它们的发生通常是因为我们的程序逻辑中存在一些错误。因此,在我们的程序进入生产模式之前,必须清除它们。从某种意义上说,它们是未经检查的,我们的程序在发生故障时必须失败,这样我们程序员就可以在开发和测试时解决它

  • 错误:错误是指程序通常无法恢复的情况。例如,如果发生
    堆栈溢出错误
    ,我们的程序就不能做很多事情,比如增加程序的函数调用堆栈的大小。或者,如果发生
    OutOfMemoryError
    ,我们将无法增加程序可用的RAM数量。在这种情况下,最好退出程序。这就是为什么它们不受约束

有关详细信息,请参阅:


    • Java要求您处理或声明所有异常。如果没有使用try/catch块处理异常,则必须在方法的签名中声明该异常

      例如:

      class throwseg1
      {
          void show() throws Exception
          {
              throw new Exception("my.own.Exception");
          }
      
          void show2() throws Exception  // Why throws is necessary here ?
          {
              show();
          }
      
          void show3() throws Exception  // Why throws is necessary here ?
          {
              show2();
          }
      
          public static void main(String s[]) throws Exception  // Why throws is necessary here ?
          {
              throwseg1 o1 = new throwseg1();
              o1.show3();
          }
      }
      
      应写为:

      class throwseg1 {
          void show() throws Exception {
              throw new Exception();
          }
      }
      

      通过这种方式,您可以在方法声明中去掉“抛出异常”声明。

      抛出异常声明是一种自动跟踪可能由于预期但不可避免的原因抛出异常的方法的方法。该声明通常特定于可能引发的异常类型,例如
      抛出IOException
      抛出IOException、MyException

      我们都有或者最终都会编写代码,这些代码意外停止并报告异常,这是由于在运行程序之前我们没有预料到的事情,比如被零除或者索引超出范围。由于该方法不希望出现错误,因此无法“捕获”错误并使用try-catch子句进行处理。任何毫无戒心的方法使用者也不会知道这种可能性,他们的程序也会停止

      当程序员知道可能发生某些类型的错误,但希望在方法之外处理这些异常时,该方法可以向调用方法“抛出”一种或多种类型的异常,而不是处理它们。如果程序员没有声明该方法(可能)抛出异常(或者如果Java没有声明异常的能力),编译器将无法知道,而该方法的未来用户将负责了解、捕获和处理该方法可能抛出的任何异常。由于程序可以有许多不同程序编写的多层方法,因此很难(不可能)跟踪哪些方法可能引发异常

      即使Java有声明异常的能力,您仍然可以编写一个包含未处理和未声明异常的新方法,Java将编译它,您可以运行它,希望一切顺利。Java不允许您编译新方法,如果它使用的方法已声明为引发异常,除非您在方法中处理已声明的异常或将方法声明为引发相同的异常,或者如果存在多个异常,您可以处理一些异常并引发其余异常

      当程序员声明该方法引发特定类型的异常时,这只是一种自动警告其他专业人员的方式
      class throwseg1 {
          void show() {
              try {
                  throw new Exception();
              } catch(Exception e) {
                  // code to handle the exception
              }
          }
      }
      
      package javaexception;
      
      
      public class JavaException {
         void show() throws Exception
          {
              throw new Exception("my.own.Exception");
          }
      
      void show2() throws Exception  // Why throws is necessary here ?
      {
          show();
      }
      
      void show3() throws Exception  // Why throws is necessary here ?
      {
          show2();
      }
      public static void main(String[] args) {
      
         JavaException a = new JavaException();
      
         try{
         a.show3();
         }catch(Exception e){
             System.out.println(e.getMessage());
         }
      }
      
      void show() throws Exception
      {
          throw new Exception("my.own.Exception");
      }
      
      void show2() throws Exception //Why throws is necessary here ?
      {
      show();
      }