在下面的程序中放置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>
答案 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
类中相应地覆盖/实现它。