一道面试题,关于java的异常处理的

 杨支榕_293 发布于 2022-10-25 05:59
  • php
  • 4 个回答
    • 这个应该是下转型的问题

      题主的问题简化成下面的样子会清晰点

      Annoyance a=new Sneeze();
      Sneeze s=(Sneeze)a;
      2022-10-26 14:22 回答
    • 这里没有做任何的类型转换,打印Caught Annoyance之后抛出的仍然是之前的对象,只是由父类型引用了。
      你描述的情况是下面的情形:

      public class Human {
          public static void main(String[] args) throws Exception {
              try {
                  try {
                      throw new Sneeze();
                  } catch (Annoyance a) {
                      System.out.println("Caught Annoyance");
                      throw new Annoyance();
                  }
              } catch (Sneeze s) {
                  System.out.println("Caught Sneeze");
                  return;
              } finally {
                  System.out.println("Hello World!");
              }
          }
      }
      2022-10-26 14:22 回答
    • 你对Java的类这个概念了解还不够,Sneeze是Annoyance的子类,意味着Sneeze一定是Annoyance,所以参数类型为Annoyance的时候,传递进去一个Sneeze实例并没有什么问题,这个实例在被抛出的时候当然会被捕获。有一段类似的代码你可以看看。

      class Animal  {
          void talk(){
              System.out.print("I'm Animal");
          }
      }
      class Human extends Animal {
          void talk(){
              System.out.print("I'm Human");
          }
      }
      
      class Main{
          public static void main(String[] args) throws Exception {
              bark(new Human());
          }
      
          static void bark(Animal a){
              a.talk();
          }
      }

      在上面的代码中,为什么最后会打印I'm Human而不是I'm Animal

      2022-10-26 14:22 回答
    • throw new Sneeze();

      为何不能被?

      } catch (Sneeze s) {
        System.out.println("Caught Sneeze");
        return;
      }
      2022-10-26 14:23 回答
    撰写答案
    今天,你开发时遇到什么问题呢?
    立即提问
    热门标签
    PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有