【问题标题】:Exception class Object is of type Checked or Unchecked异常类 Object 的类型为 Checked 或 Unchecked
【发布时间】:2015-04-22 03:44:07
【问题描述】:
import java.io.*;
class a {
    public static void main(String [] args) {
        try {
            new a().go();
        }
        catch(Exception e) {
            System.out.println("catch");
        }   
    }

    void go() {}
}

Already visited this link but didn't got my answer

  • 如果 Exception 类对象被认为是 Checked :即使永远不会从 go 方法抛出 Exception 对象,此代码也可以正常编译。完全可以从 try 块中抛出的已检查异常得到处理,而没有其他处理。所以无法检查。

  • 如果 Exception 类对象被认为是 UnChecked :Exception 类不是 Error 或 RuntimeException 的子类,因此不能取消选中。

请帮助我理解......它是哪种类型的对象。

【问题讨论】:

    标签: java exception-handling


    【解决方案1】:

    Exception is a checked exception. 这实际上更像是一种排斥;它既不是Error 也不是RuntimeException,它们都被认为是未选中的。

    未经检查的异常类是运行时异常类和错误类。

    已检查异常类是除未检查异常类之外的所有异常类。也就是说,检查的异常类都是Throwable的子类,除了RuntimeException及其子类和Error及其子类。

    也就是说,您设计的示例仍然可以编译,因为 Exception 是所有运行时异常的超类,(出于某种原因)预计会在您的代码块中捕获。由于您没有声明将 Exception 抛出到 go,因此您不需要捕获它,因为它不是已检查异常。

    不要在生产中使用这样的代码,因为任何检查异常或运行时异常都会被该块捕获。

    【讨论】:

    • 感谢您的回答......我会确保不在生产中使用它
    【解决方案2】:

    RuntimeException 是 Exception 的子类,因此您的 catch 块会同时提取已检查和未检查的异常。

    【讨论】:

    • 是的,我知道,但是 Exception 类本身的对象呢。它显示了哪种类型的属性?
    • Exception 是根类(其实是 Throwable)。这些是已检查的异常,但是如果它是 RuntimeException 或其他使其未检查的扩展。
    • 如果要抛出异常实例,则需要说“void method() throws Exception”。 method() 的调用者必须直接处理异常。 (但请不要抛出异常 :-)
    • @Aman - 只有当你有一个具体的实例可以使用时,Exception 才会被选中或取消选中。如果你不这样做,比如简单地写catch (Exception e) {...}Exceptionboth 类型,或者两者都不是,这取决于你的偏好。这是因为Exception 是所有已检查和未检查异常的共享超类。当以这种方式使用时,它包括两种类型。当一个具体实例被构造时,它只有一个。
    【解决方案3】:

    查看此链接http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html

    Exception 类和任何不是 RuntimeException 子类的子类都是检查异常

    所以要回答你的问题,这是一个检查异常。

    【讨论】:

    • 感谢您的链接...它给出了我的答案。但是请说明为什么代码编译得很好,因为 try 块没有抛出检查异常。
    • 我不确定这是否真的回答了这个问题。有一个需要考虑的上下文问题。当你构造一个new Exception() 并抛出它时,这是一个检查异常。您将需要针对您的方法声明它,并且调用者将需要捕获它。但是,当您编写catch (Exception e) {} 时,您是在说您想要捕获both 已检查和未检查的异常。重要的一点是,Exception(或其子类)只有在构造具体实例时才能说是选中或未选中。
    • 已检查异常和未检查异常之间的区别在于 - 已检查异常:您必须捕获它,因为它希望您做一些事情来从异常中恢复。如果您编写的代码可能会在没有 catch 块的情况下抛出已检查的异常,它将无法编译。在你的情况下,你有一些不会抛出检查异常并且仍然​​有 catch 块的东西,所以即使你不需要包含 catch 块,它仍然可以编译。 - 未经检查的异常:您不必编写 catch 块,它通常表示意外或不可恢复的情况。
    【解决方案4】:
    • 如果异常类对象被视为已检查

    是的。

    即使 Exception 对象永远不会从 go 方法中抛出,此代码也可以正常编译。

    你不知道。可能有RuntimeException.

    完全可以从 try 块中抛出的已检查异常得到处理,没有其他处理。

    这是不正确的。已检查的异常运行时异常被捕获。

    所以无法检查。

    从错误的前提中推论无效。

    • 如果 Exception 类对象被认为是 UnChecked

    已检查。剩下的就不用考虑了。

    Exception 类不是 Error 或 RuntimeException 的子类,因此不能取消选中。

    正确。

    【讨论】:

      【解决方案5】:

      异常类被认为是检查异常。

      已检查的异常意味着您需要将抛出异常的方法封装在 Try catch
      否则,您需要添加 throws 声明,以便调用它的父方法处理异常。

      【讨论】:

        【解决方案6】:

        异常类本身不是已检查的异常..已检查的异常是异常类的子异常,例如 IOException 等 有两件事..
        1- 你要扔它吗??
        2- 您是在谈论在 catch 子句中声明它吗??


        让我们用示例来演示它

        1- 如果您抛出任何 Exception 类 except(RuntimeException 或其子类),那么您必须通过 catch 子句处理它或通过 throws 声明它。无论它是 Exception 类还是 Throwable 或其他 Checked Exceptions 。例如

        void go() throws Exception
        { 
        throw new Exception();
        } //you have to handle or declare it
        

        现在调用方法应该必须处理或声明它

        2- 您的意思是,您是在谈论在 catch 子句中声明它。 (例外与其他检查的例外)
        如果在 catch 中声明,则不需要抛出异常,但如果被捕获,则需要抛出异常。(简单的答案是)

        void callingMethod()
        {
          try{ } // NO NEED TO THROW Exception OR Thowable
          catch(Exception e){ 
              e.printStakeTrace(); 
          }
        }
        

        //在检查异常的情况下,如果你正在捕捉它,你必须通过它>>否则编译器会告诉你通过它e-g

        void callingMethod()
        {
          try{ } // here is compiler error..it says you have to through it
          catch(IOException e){ 
              e.printStakeTrace(); 
          }
        } 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-07-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-05
          • 2021-02-27
          • 2014-06-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多