【问题标题】:How does java detects Checked Exceptions?java如何检测Checked Exceptions?
【发布时间】:2013-08-07 12:04:55
【问题描述】:

如果我这样写:

public static void main(String[] args) {
    try {
    } catch (MalformedURLException e) { 
        e.printStackTrace()
    };
}

Java 编译器在 MalformedURLException 的 catch 子句处显示编译错误。如果我插入线 URL url = new URL("HI"); 在尝试块中,抱怨停止。我认为 java 必须将这些已检查的异常与 package.json 绑定。然后我通过仅在 try 块中插入“CookieManager manager = new CookieManager();”来尝试另一类 java.net 包。编译错误再次开始。

那么对于像这样的编译时错误,JVM如何将这些检查异常与java类绑定呢?

【问题讨论】:

    标签: java exception jvm checked-exceptions


    【解决方案1】:

    方法声明指定方法抛出的异常。编译器可以访问此信息。如果您尝试捕获 try 子句中调用的代码无法抛出的异常,编译器会发出错误消息。

    【讨论】:

      【解决方案2】:

      在检查异常的情况下,必须在捕获之前抛出一些东西!

      public static void main(String[] args) {
          try {
          } catch (MalformedURLException e) {
              e.printStackTrace()
          };
      }
      

      在这种情况下,这些是不可能抛出异常的,所以你无法捕获它。

      添加时

      URL url = new URL("HI");
      

      构造函数抛出异常,因此您需要捕获它。

      public URL(String protocol, String host, int port, String file)
          throws MalformedURLException
      {
          this(protocol, host, port, file, null);
      }
      

      但是 CookieManager 构造函数不会抛出任何异常。所以没必要抓住它。

      /**
       * Create a new cookie manager.
       *
       * <p>This constructor will create new cookie manager with default
       * cookie store and accept policy. The effect is same as
       * <tt>CookieManager(null, null)</tt>.
       */
      public CookieManager() {
          this(null, null);
      }
      

      【讨论】:

        【解决方案3】:

        对于每个方法,检查的异常都保存到类文件中。

        当您使用已检查的异常调用此类方法时,编译器会检查您是捕获异常还是从方法中抛出异常。

        【讨论】:

          【解决方案4】:

          来自http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.21

          14.21。无法访问的语句

          如果由于无法访问而无法执行语句,则这是编译时错误。

          ...

          如果满足以下两个条件,则可以访问 catch 块 C:

          • C 的参数类型要么是未经检查的异常类型,要么是 Throwable;或者 try 块中的某些表达式或 throw 语句是可访问的,并且可以抛出一个已检查的异常,其类型可分配给 catch 子句 C 的参数。

          如果包含它的最里面的语句是可访问的,则表达式是可访问的。

          有关表达式的正常和突然完成,请参阅 §15.6。

          • try 语句中没有更早的catch 块A,使得C 的参数类型与A 的参数类型相同或其子类。

          如果 try 块为空,则第一个条件不成立:没有任何东西“可以抛出类型可分配给 catch 子句 C 的参数的已检查异常”。

          【讨论】:

            【解决方案5】:

            这只是 Java 的超级警惕的编译器抱怨:如果你没有抛出任何异常,你没有调用任何抛出它的代码,那么为什么你有一个无用的 try-catch 块浪费空间?

            因此,当您让编译器有理由相信此块中可能发生异常时,它会关闭。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-04-01
              • 1970-01-01
              • 1970-01-01
              • 2011-12-04
              • 1970-01-01
              相关资源
              最近更新 更多