• 多态与异常------动手动脑


    课堂动手动脑

    1.    下面那个语句会引起编译错误?

    class Mammal{}

    class Dog extends Mammal {}

    class Cat extends Mammal{}

    public class TestCast

    {

          public static void main(String args[])

          {

               Mammal m;

               Dog d=new Dog();

               Cat c=new Cat();

               m=d;//不会报错,子类的对象可以赋值给父类的引用

               d=m;//会报错,父类的引用不能直接赋值给子类的对象。想要赋值,必须进行强制类型转换

               d=(Dog)m;//不会报错,进行了强制类型转换

               d=c;//会报错,虽然这两个类派生自同一个类,但是这两个类之间并没有继承关系,互相属于不同的类,不能直接进行赋值

               c=(Cat)m;//不会报错,进行了强制类型转换

               d = (Dog)c;//这句是我自己附加的,这句话也会报错。因为不同的类之间也不能进行强制类型转换

          }

    }

    2CatchWho

    package Seven;

     

    public class CatchWho

    {

      public static void main(String[] args)

      {

         try

         {

           try

           {

             throw new ArrayIndexOutOfBoundsException();

           }

           catch (ArrayIndexOutOfBoundsException e)

           {

             System.out.println("ArrayIndexOutOfBoundsException"

                  + "/内层try-catch");

           }

     

           throw new ArithmeticException();

         }

         catch (ArithmeticException e)

         {

           System.out.println("发生ArithmeticException");

         }

         catch (ArrayIndexOutOfBoundsException e)

         {

           System.out.println("ArrayIndexOutOfBoundsException"

                + "/外层try-catch");

         }

      }

    }

     

    3CatchWho2

    package Seven;

    public class CatchWho2

    {

        public static void main(String[] args)

        {

            try

            {

                try

                {

                    throw new ArrayIndexOutOfBoundsException();

                }

                catch(ArithmeticException e)

                {

                    System.out.println( "ArrayIndexOutOfBoundsException" + "/内层try-catch");

                }

                throw new ArithmeticException();

            }

            catch(ArithmeticException e)

            {

                System.out.println("发生ArithmeticException");

            }

            catch(ArrayIndexOutOfBoundsException e)

            {

                System.out.println( "ArrayIndexOutOfBoundsException" + "/外层try-catch");

            }

        }

    }

     

    对比CatchWh和CatchWho2这两个例子来看,我们可以得出一个结论:当有try语句的嵌套时,如果内层try语句抛出的异常能够被内层的catch语句处理掉的话,由内层的try语句处理,但这时外层的try语句也是被执行的,因为外层try语句块里面的一个子快执行了。如果内层try语句的catch语句不能成功的处理掉这个异常,这个异常就要向上层try语句抛出了。而且,try语句块里面一旦抛出异常,那么,抛出异常的语句后面的语句都不会被执行。

    4 AboutException

    package Seven;

     

    import javax.swing.*;

     

    public class AboutException {

       public static void main(String[] a)

       {

          int i=1, j=0, k;

          k=i/j;

     

     

      try

      {

        

         k = i/j;    // Causes division-by-zero exception

         //throw new Exception("Hello.Exception!");

      }

     

      catch ( ArithmeticException e)

      {

         System.out.println("被0除.  "+ e.getMessage());

      }

     

      catch (Exception e)

      {

         if (e instanceof ArithmeticException)

           System.out.println("被0除");

         else

         { 

           System.out.println(e.getMessage());

          

         }

      }

     

     

      finally

         {

            JOptionPane.showConfirmDialog(null,"OK");

         }

        

      }

    }

     

    由于k=i/j;语句没有在try语句块里面,因此catch语句块不能处理这个异常。

    5 EmbededFinally

    package Seven;

     

    public class EmbededFinally {

     

       

      public static void main(String args[]) {

           

         int result;

           

         try {

               

           System.out.println("in Level 1");

     

              

            try {

                   

             System.out.println("in Level 2");

      // result=100/0;  //Level 2

                  

              try {

                      

                System.out.println("in Level 3");

                         

                result=100/0;  //Level 3

                   

             }

                   

             catch (Exception e) {

                       

                System.out.println("Level 3:" + e.getClass().toString());

                   

             }

                   

                   

             finally {

                       

                System.out.println("In Level 3 finally");

                   

             }

                   

                  

             // result=100/0;  //Level 2

     

               

             }

               

           catch (Exception e) {

                  

              System.out.println("Level 2:" + e.getClass().toString());

              

            }

            finally {

                   

             System.out.println("In Level 2 finally");

              

            }

                

           // result = 100 / 0;  //level 1

           

         }

           

         catch (Exception e) {

               

           System.out.println("Level 1:" + e.getClass().toString());

           

         }

           

         finally {

                  System.out.println("In Level 1 finally");

           

         }

       

      }

     

    }

     

    由内层向外层逐层调用。

    6 finally语句块一定会被执行吗?

    package Seven;

     

    public class SystemExitAndFinally {

     

        public static void main(String[] args)

        {

            try{

     

                System.out.println("in main");

                throw new Exception("Exception is thrown in main");

                //System.exit(0);

     

            }

            catch(Exception e)

            {

                System.out.println(e.getMessage());

                System.exit(0);

            }

            finally

            {

                System.out.println("in finally");

            }

        }

     

    }

    不一定。一般来说,只有当与fianally语句块对应的try语句块执行的时候,该finallya语句块才能被执行。但是这也不是绝对的,就像在这个例子里面,即使是与finally语句块对应的try语句块被执行了,finally语句块依旧没有被执行。因为catch语句块里面有强行结束程序的语句。

  • 相关阅读:
    net core 在开发环境IIS程序物理路径指向代码文件
    asp.net core 源码下载以及build
    Autofac学习之三种生命周期:InstancePerLifetimeScope、SingleInstance、InstancePerDependency
    ASP.NET Core 使用 AutoFac 注入 DbContext
    ASP.net core 中控制器直接访问wwwroot的静态文件
    在ASP.NET Core中处置IDisposable的四种方法
    sql语句优化之SQL Server(详细整理)
    sql语句的优化分析
    sql server中如何查看执行效率不高的语句
    [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了
  • 原文地址:https://www.cnblogs.com/1102whw/p/4972115.html
Copyright © 2020-2023  润新知