• java多态与异常处理——动手动脑


    代码一:

    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;

           }

    }

    结果截图:

    错误分析:

    1、子类对象可以直接赋给基类变量。

    2、基类对象要赋给子类对象变量,必须执行类型转换,其语法是:子类对象变量=(子类名)基类对象名;也不能乱转换。如果类型转换失败Java会抛出以下这种异常:ClassCastException

    代码二:

    import javax.swing.*;

    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");     

        }   

      }

    }

    结果截图:

    结果分析:

    1、把可能会发生错误的代码放进try语句块中。

    2、当程序检测到出现了一个错误时会抛出一个异常对象。异常处理代码会捕获并处理这个错误。

    3、catch语句块中的代码用于处理错误。
    4、当异常发生时,程序控制流程由try语句块跳转到catch语句块。
    5、不管是否有异常发生,finally语句块中的语句始终保证被执行。

    6、如果没有提供合适的异常处理代码,JVM将会结束掉整个应用程序。

    代码三

    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");
            }
        }
    }

    结果截图:

    代码四:
    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");
            }
        }
    }

    结果截图:

    结果分析:

    1、可以有多个catch语句块,每个代码块捕获一种异常。在某个try块后有两个不同的catch 块捕获两个相同类型的异常是语法错误。

    2、使用catch语句,只能捕获Exception类及其子类的对象。因此,一个捕获Exception对象的catch语句块可以捕获所有“可捕获”的异常。

    3.将catch(Exception e)放在别的catch块前面会使这些catch块都不执行,因此Java不会编译这个程序。

    代码五:

    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");     

                }    

          }

    }

    结果截图:

    结果分析:当有多层嵌套的finally时,异常在不同的层次抛出 ,在不同的位置抛出,可能会导致不同的finally语句块执行顺序。

  • 相关阅读:
    在centos7下 布隆过滤器2种安装方式
    Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
    redis lua --eval报错1: Lua redis() command arguments must be strings or integers
    redis+lua脚本 分布式锁初步学习
    redis中通用命令(key)和补充
    redis基本数据类型有序集合(zset)学习笔记
    redis基本数据结构集合(set)学习笔记
    大道至简读后感
    第一周
    《大道至简》读后感
  • 原文地址:https://www.cnblogs.com/dongge0611/p/4964254.html
Copyright © 2020-2023  润新知