如何使用switch case处理Class Cast Exception?

时间:2018-04-08 07:55:05

标签: java exception

在下面的程序中放置try catch来处理Class Cast Exception?

Class Animal { }
Class Dog extends Animal { }
Class Cat extends Animal { }
Class MainRunner {
    public static void main(String args[]) {
        System.out.println("Main method started");
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter the key value");
        int key = sc.nextInt();
        Animal a = null;
        switch (key) {
            case 1 : a = new Cat(); break;
            case 2 : a = new Dog(); break;
            default : System.out.println("invalid choice");
            return;
        }
        Dog d = (Dog)a;
        System.out.println("main method ended");
    }
}

对于Cat类没有进行向下转换,因此当输入键值为1时,它将抛出类强制转换异常。如何使用try catch来处理它?在哪里插入try catch以便处理它?<​​/ p>

5 个答案:

答案 0 :(得分:1)

是@Pshemo提到的;是的;你应该使用instanceof运算符来检查它的Dog实例并相应地初始化它

Dog d=null;
if(a instanceof Dog)
  d=(Dog)a;
System.out.println(d);

理想情况下,您不需要垂头丧气。除非你必须调用你的子类实现的专门方法。否则,应使用接口/父类方法。

example : a.eat() // eat will be present in animal and will be implemented differently in each sub-class dog and cat.

但如果你需要以树皮为例;然后你可能需要进行子投射,但是使用instanceof

以安全的方式进行
if (a instanceof Dog) ((Dog)a).bark();
else syso("Animal cannot bark");

答案 1 :(得分:1)

声明每种类型的两个varibale并在case语句中初始化。

public class MainRunner {
        public static void main(String args[]) {
            System.out.println("Main method started");
            Scanner sc = new Scanner(System.in);
            System.out.println("Enter the key value");
            int key = sc.nextInt();
            Animal a = null;
            Dog d=null;
            Cat c=null;
            switch (key) {
                case 1 : a = new Cat();
                c=(Cat)a;
                break;
                case 2 : a = new Dog();
                d=(Dog)a;
                break;
                default : System.out.println("invalid choice");
                return;
            }
             if(d!=null){/*  to do */}
             if(c!=null){/*  to do */}
            System.out.println("main method ended");
        }

答案 2 :(得分:0)

无需捕获异常,只需在强制转换之前使用instanceof方法。

public static void main(String args[]){
        System.out.println("Main method started");
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter the key value");
        int key = sc.nextInt();
        Animal a = null;
        switch (key){
            case 1 : a = new Cat(); break;
            case 2 : a = new Dog(); break;
            default : System.out.println("invalid choice");
            return;
        }
        Dog d;
        Cat c;
        if(a!= null && a instanceof Dog)
            d =(Dog)a;
        else if(a!= null && a instanceof Cat)
            c = (Cat)c;

        System.out.println("main method ended");
    }

答案 3 :(得分:0)

不需要任何尝试捕获。您可以通过使用ClassCastException运算符来避免instanceof,如下所示 -

Class Animal { }
Class Dog extends Animal { }
Class Cat extends Animal { }
Class MainRunner {
    public static void main(String args[]) {
        System.out.println("Main method started");
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter the key value");
        int key = sc.nextInt();
        Animal a = null;
        switch (key) {
        case 1 : a = new Cat(); break;
        case 2 : a = new Dog(); break;
        default : System.out.println("invalid choice");
        return;
        }
        /* 
         * as per your logic of default block, for invalid choice control is getting 
         * returned back from default block only and if control comes here it means 
         * `a` will not have null value, so skipping null check
         * */
        if(a instanceof Dog){
            Dog d = (Dog)a;
            }
        else{
            Cat c = (Cat)a;
            }
        System.out.println("main method ended");
        }
    }

答案 4 :(得分:0)

我可能会为此受到憎恨和贬低,但是...... [/ p>

当解决方案是要避免这种情况时,这里的人们会给你解决方案(或者我最好称之为'黑客')以解决你的这个问题。

拥有Animal类的重点是避免以后向下转发。你的交换机基本上完成了Factory Pattern (checkout Step 3)的工作,这种模式在库和框架中被广泛使用,而不仅仅是在Java中。事实上,你不知道工厂出来的东西实际上是一件好事,它给你和提供实际实现的人(它不一定是你)具有很大的灵活性。

如果您愿意,可以说,向下转换为Dog,因为您需要调用bark方法 - 请勿在{{1​​}}课程中创建makeSound方法,然后在Animal类中相应地覆盖/实现它。