阶段性综合练习(动物乐园)
1.需求
展示所有动物相关信息(名字,腿条数,叫)
用户选择,进行修改动物信息的操作(名字,腿条数)
腿的条数输入错误的话,进行异常处理
2.分析
名词(类,属性):
动物(父类)
属性:
动物的名字
动词(方法):叫
接口:获得腿的条数
鸭子,猫(子类)
海豚(子类)
业务类
初始化动物信息
修改动物信息
动物父类
package Zoo;
public abstract class Animal {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public Animal(){}
public Animal(String name){
this.name=name;
}
public abstract String shout();
}
有腿的动物接口
package Zoo;
public interface Leg {
int getlegnumber();
}
鸭子类
package Zoo;
import Door.Door;
public class Dunck extends Animal implements Leg {
int legnum;
public String shout(){
return "嘎嘎嘎";
}
public int getlegnumber(){
return legnum;
}
public Dunck(){}
public Dunck(String name,int leg){
super(name);
this.legnum=leg;
}
}
海豚类
package Zoo;
public class Delphi extends Animal {
public Delphi(){}
public Delphi(String name){
super(name);
}
public String shout() {
return ("海豚音");
}
}
猫类
package Zoo;
public class Cat extends Animal implements Leg {
int legnum;
public String shout(){
return "喵喵喵喵";
}
public int getlegnumber(){
return legnum;
}
public Cat(){}
public Cat(String name,int leg){
super(name);
this.legnum=leg;
}
}
业务类
package Zoo;
import java.util.Scanner;
/**
* 业务类
*
* 初始化动物信息
*
* 修改动物信息
* **/
public class AnimalMgr {
Animal[] animal=new Animal[3];
Scanner input=new Scanner(System.in);
int choose;
public void init(){
animal[0]=new Cat("加菲猫",4);
animal[1]=new Dunck("唐老鸭",2);
animal[2]=new Delphi("琪琪");
}
public void show(){
System.out.println("动物名字\t腿的条数\t动物叫");
int leg;
String name;
for (Animal animal:animal){
name=animal.getName();
if (animal instanceof Leg){
leg=((Leg) animal).getlegnumber();
}else {
leg=0;
}
String shout=animal.shout();
System.out.println(name+"\t\t"+leg+"\t\t\t"+shout);
}
System.out.println("是否继续修改数据:按0进行修改,其他数字退出");
choose=input.nextInt();
}
/**
* 修改动物信息**/
public void modifyAnimal()throws Exception{
String name[]=new String[3];
int leg[]=new int[2];
System.out.println("请输入猫的名字");
input.nextLine();
name[0]=input.nextLine();
System.out.println("请输入猫的腿条数");
leg[0]=input.nextInt();
if (leg[0]!=4){
throw new Exception("猫只有四条腿");
}
System.out.println("请输入鸭子的名字");
input.nextLine();
name[1]=input.nextLine();
System.out.println("请输入鸭子的腿条数");
leg[1]=input.nextInt();
if (leg[1]!=2){
throw new Exception("鸭子只有两条腿");
}
System.out.println("请输入海豚的名字");
input.nextLine();
name[2]=input.nextLine();
animal[0]=new Cat(name[0],leg[0]);
animal[1]=new Dunck (name[1],leg[1]);
animal[2]=new Delphi (name[2]);
}
public static void main(String[] args) {
AnimalMgr animalMgr=new AnimalMgr();
animalMgr.init();
do {
animalMgr.show();
if (animalMgr.choose==0){
try {
animalMgr.modifyAnimal();
} catch (Exception e) {
e.printStackTrace();
}
}
}while (animalMgr.choose==0);
}
}
遇到的问题
14: Animal[] animal=new Animal[4];
18: animal[0]=new Cat("加菲猫",4);
19: animal[1]=new Dunck("唐老鸭",2);
20: animal[2]=new Delphi("琪琪");
26: for (Animal animal:animal){
27: name=animal.getName();
28: if (animal instanceof Leg){
29: leg=((Leg) animal).getlegnumber();
33: String shout=animal.shout();
42: AnimalMgr animalMgr=new AnimalMgr();
43: init();
44: show();
- 在第14行,
animal
被声明为一个Animal
类型的数组,并分配了4个元素的空间。 - 在第18、19和20行,数组的前三个元素分别被初始化为
Cat
、Dunck
和Delphi
的实例。 - 第26行开始了一个增强型for循环,用于遍历
animal
数组。
ring shout=animal.shout();
42: AnimalMgr animalMgr=new AnimalMgr();
43: init();
44: show();
- 在第14行,`animal`被声明为一个`Animal`类型的数组,并分配了4个元素的空间。
- 在第18、19和20行,数组的前三个元素分别被初始化为`Cat`、`Dunck`和`Delphi`的实例。
- 第26行开始了一个增强型for循环,用于遍历`animal`数组。
从这些信息来看,`animal`数组本身不应该为`null`,并且它的前三个元素已经被正确初始化。然而,第四个元素没有被初始化,这可能是导致空指针异常的原因。当增强型for循环尝试处理第四个元素时,由于它没有被初始化,所以是`null`,因此调用`getName()`时抛出了空指针异常。