程序是一个关于DVD管理器的模拟小软件。
一共分为三个类:
//这个是程序入口
import java.util.Scanner;
public class Page341 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);

DVD d=new DVD();
DVD[] sd=new DVD[10];
Menu m=new Menu();
m.initalDvd(sd);//初始化
m.showMenu();//菜单展示


boolean cont=true;
int input=0;
while(cont){
System.out.print("请选择:");
input=sc.nextInt();
switch(input){
case 1:
System.out.println("--------> 新增DVD");
m.addMenu(sd);
m.startMenu();
break;
case 2:
System.out.println("--------> 查看DVD");
m.lookBookMenu(sd);
m.startMenu();
break;
case 3:
System.out.println("--------> 删除DVD");
m.deleteBookMenu(sd);
m.startMenu();
break;
case 4:
System.out.println("--------> 借出DVD");
m.lendBookMenu(sd);
m.startMenu();
break;
case 5:
System.out.println("--------> 归还DVD");
m.returnBookMenu(sd);
m.startMenu();
break;
case 6:
System.out.println("谢谢使用!");
cont=false;
}
}
}
//这个是DVD类
public class DVD {
String name;//书名
String lendTime;//借出时间
int state=0;//书籍借出与否的状态
}//这个是菜单类
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class Menu {
Scanner sc=new Scanner(System.in);
public void showMenu(){
System.out.println("欢迎使用迷你DVD管理器\n"+
                "------------------------------------------------");
        System.out.println("1.新增DVD\n"+
                           "2.查看DVD\n"+
                   "3.删除DVD\n"+
                           "4.借出DVD\n"+
                   "5.归还DVD\n"+
                           "6.退出");
        System.out.println("------------------------------------------------");
}
//初始化数组
public void initalDvd(DVD[] sd) {
for (int i = 0; i < 3; i++) {
sd[i]=new DVD();
System.out.print("请输入书名:");
sd[i].name=sc.next();
System.out.print("请输入该书的状态(0,未借出 1,借出):");
sd[i].state=sc.nextInt();
if(sd[i].state==1){
         System.out.println("请输入时间:");
         sd[i].lendTime=sc.next();
}
}
}
//增加DVD
public void addMenu(DVD[] sd) {
boolean condition=false;
String newBookName="";

do {
System.out.println("请输入DVD名称:");
    newBookName=sc.next();
    for (int i = 0; i < sd.length; i++) {
      if(sd[i]==null){
      sd[i]=new DVD();
      sd[i].name=newBookName;
      break;
        }  
         }
  
for (int i = 0; i < sd.length; i++) {
if (sd[i] != null) {
System.out.print(sd[i].name + "");
}
}
System.out.println("是否增加书本?(y/n):");
if(sc.next().equals("n"))
condition=false;
else
condition=true;
} while (condition);
System.out.println("新增《"+newBookName+"》成功! ");
System.out.println("**************************************************");

}
//查看DVD
public void lookBookMenu(DVD[] sd) {
System.out.println("序号\t状态\t名称\t借出日期");
for (int i = 0; i < sd.length; i++) {
if((sd[i]!=null)&&(sd[i].state==1))
     System.out.print((i+1)+"\t"+"已借出\t"+"《"+sd[i].name+"》\t"+sd[i].lendTime);
if((sd[i]!=null)&&(sd[i].state==0))
System.out.print((i+1)+"\t"+"可借\t"+"《"+sd[i].name+"》\t");
if(sd[i]!=null)
    System.out.println();
}

}
//删除DVD
public void deleteBookMenu(DVD[] sd) {
boolean condition=false;
String name="";
do {
System.out.println("请输入DVD名称:");
name = sc.next();
for (int i = 0; i < sd.length; i++) {
if ((sd[i] != null) && (sd[i].name.equals(name))
&& (sd[i].state == 0)){
for (int j = i;; j++) {
if(sd[j+1]==null)
break;
sd[j].name=sd[j+1].name;
  }
}
if ((sd[i] != null) && (sd[i].name.equals(name))
&& (sd[i].state == 1))
System.out.println(sd[i].name + "为借出状态,不能删除!");

}
for (int i = 0; i < sd.length; i++) {
if(sd[i].name!=null)
      if(sd[i].name==(sd[i+1].name)){
 sd[i+1].name="";//这里赋null有BUG,带求解!
 break;
 }
}
for (int i = 0; i < sd.length; i++) {
if(sd[i]!=null)
System.out.print(sd[i].name + " ");
}
System.out.println("是否成功删除?(y/n):");
if(sc.next().equals("y"))
condition=false;
else
condition=true;
} while (condition);
System.out.println("删除《"+name+"》成功! ");
System.out.println("**************************************************");
}
//借出DVD
public void lendBookMenu(DVD[] sd) {
boolean condition=false;
String name="",time="";

do {
System.out.print("请输入DVD名称:");
name = sc.next();
System.out.print("请输入借出日期(年-月-日):");
time = sc.next();
for (int i = 0; i < sd.length; i++) {
if ((sd[i].name.equals(name)) && (sd[i].state != 1)) {
sd[i].lendTime = time;
sd[i].state = sd[i].state + 1;
System.out.println("借出《" + name + "》成功!");
break;
}
if ((sd[i].name.equals(name)) && (sd[i].state == 1)){
System.out.print("该书已被借出!");
condition=true;
}
}
} while (condition);
System.out.println("**************************************************");
}
//归还DVD
public void returnBookMenu(DVD[] sd) {
String name="",time="";
double pay=0;

System.out.print("请输入DVD名称:");
name = sc.next();
System.out.print("请输入归还日期(年-月-日):");
time = sc.next();
for (int i = 0; i < sd.length; i++) {
if(((sd[i].state-=1)==0)&&(sd[i].name.equals(name))){
System.out.println("归还《"+sd[i].name+"》成功!");
break;
}
}

for (int i = 0; i < sd.length; i++) {
if(sd[i].name.equals(name)){
System.out.print("借出日期为:"+sd[i].lendTime+"\n");
System.out.print("归还日期为:"+time);
pay=charge(sd[i].lendTime,time)*1;
System.out.println("应付租金(元):"+pay);
break;
}
}


System.out.println("**************************************************");
} //计算时间差
public long charge(String dstr1,String dstr2){
long charge=0;
SimpleDateFormat sd=new SimpleDateFormat("yyyy-MM-dd");
try{
Date d1=sd.parse(dstr1);
Date d2=sd.parse(dstr2);
charge=(d2.getTime()-d1.getTime())/(24*60*60*1000);
}catch(ParseException e){
e.printStackTrace();
}
return charge;
}

     public void startMenu(){
System.out.print("输入0返回主菜单:");
if(sc.nextInt()==0)
showMenu();
}
}
如上代码在菜单类中的删除DVD书名方法中,我删除了一个书名后,数据前移,最后一位,还能打印出“null”这个符号来。让我很无解,无语。求各位大侠帮忙!!!小弟在此感谢你们了!

解决方案 »

  1.   

    菜单类更改下:
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Scanner;
    public class Menu {
    Scanner sc=new Scanner(System.in);
    public void showMenu(){
    System.out.println("欢迎使用迷你DVD管理器\n"+
                    "------------------------------------------------");
            System.out.println("1.新增DVD\n"+
                               "2.查看DVD\n"+
                       "3.删除DVD\n"+
                               "4.借出DVD\n"+
                       "5.归还DVD\n"+
                               "6.退出");
            System.out.println("------------------------------------------------");
    }
    //初始化数组
    public void initalDvd(DVD[] sd) {
    for (int i = 0; i < 3; i++) {
    sd[i]=new DVD();
    System.out.print("请输入书名:");
    sd[i].name=sc.next();
    System.out.print("请输入该书的状态(0,未借出 1,借出):");
    sd[i].state=sc.nextInt();
    if(sd[i].state==1){
             System.out.println("请输入时间:");
             sd[i].lendTime=sc.next();
    }
    }
    }
    //增加DVD
    public void addMenu(DVD[] sd) {
    boolean condition=false;
    String newBookName="";

    do {
    System.out.println("请输入DVD名称:");
        newBookName=sc.next();
        for (int i = 0; i < sd.length; i++) {
          if(sd[i]==null){
          sd[i]=new DVD();
          sd[i].name=newBookName;
          break;
            }  
             }
      
    for (int i = 0; i < sd.length; i++) {
    if (sd[i] != null) {
    System.out.print(sd[i].name + "");
    }
    }
    System.out.println("是否增加书本?(y/n):");
    if(sc.next().equals("n"))
    condition=false;
    else
    condition=true;
    } while (condition);
    System.out.println("新增《"+newBookName+"》成功! ");
    System.out.println("**************************************************");

    }
    //查看DVD
    public void lookBookMenu(DVD[] sd) {
    System.out.println("序号\t状态\t名称\t借出日期");
    for (int i = 0; i < sd.length; i++) {
    if((sd[i]!=null)&&(sd[i].state==1))
         System.out.print((i+1)+"\t"+"已借出\t"+"《"+sd[i].name+"》\t"+sd[i].lendTime);
    if((sd[i]!=null)&&(sd[i].state==0))
    System.out.print((i+1)+"\t"+"可借\t"+"《"+sd[i].name+"》\t");
    if(sd[i]!=null)
        System.out.println();
    }

    }
    //删除DVD
    public void deleteBookMenu(DVD[] sd) {
    boolean condition=false;
    String name="";
    do {
    System.out.println("请输入DVD名称:");
    name = sc.next();
    for (int i = 0; i < sd.length; i++) {
    if ((sd[i] != null) && (sd[i].name.equals(name))
    && (sd[i].state == 0)){
    for (int j = i;; j++) {
    if(sd[j+1]==null)
    break;
    sd[j].name=sd[j+1].name;
      }
    }
    if ((sd[i] != null) && (sd[i].name.equals(name))
    && (sd[i].state == 1))
    System.out.println(sd[i].name + "为借出状态,不能删除!");

    }
    for (int i = 0; i < sd.length; i++) {
    if(sd[i].name!=null)
          if(sd[i].name==(sd[i+1].name)){
     sd[i+1].name=null;//这里赋null有BUG,带求解!
     break;
     }
    }
    for (int i = 0; i < sd.length; i++) {
    if(sd[i]!=null)
    System.out.print(sd[i].name + " ");//这里仍然打印出null
    }
    System.out.println("是否成功删除?(y/n):");
    if(sc.next().equals("y"))
    condition=false;
    else
    condition=true;
    } while (condition);
    System.out.println("删除《"+name+"》成功! ");
    System.out.println("**************************************************");
    }
    //借出DVD
    public void lendBookMenu(DVD[] sd) {
    boolean condition=false;
    String name="",time="";

    do {
    System.out.print("请输入DVD名称:");
    name = sc.next();
    System.out.print("请输入借出日期(年-月-日):");
    time = sc.next();
    for (int i = 0; i < sd.length; i++) {
    if ((sd[i].name.equals(name)) && (sd[i].state != 1)) {
    sd[i].lendTime = time;
    sd[i].state = sd[i].state + 1;
    System.out.println("借出《" + name + "》成功!");
    break;
    }
    if ((sd[i].name.equals(name)) && (sd[i].state == 1)){
    System.out.print("该书已被借出!");
    condition=true;
    }
    }
    } while (condition);
    System.out.println("**************************************************");
    }
    //归还DVD
    public void returnBookMenu(DVD[] sd) {
    String name="",time="";
    double pay=0;

    System.out.print("请输入DVD名称:");
    name = sc.next();
    System.out.print("请输入归还日期(年-月-日):");
    time = sc.next();
    for (int i = 0; i < sd.length; i++) {
    if(((sd[i].state-=1)==0)&&(sd[i].name.equals(name))){
    System.out.println("归还《"+sd[i].name+"》成功!");
    break;
    }
    }

    for (int i = 0; i < sd.length; i++) {
    if(sd[i].name.equals(name)){
    System.out.print("借出日期为:"+sd[i].lendTime+"\n");
    System.out.print("归还日期为:"+time);
    pay=charge(sd[i].lendTime,time)*1;
    System.out.println("应付租金(元):"+pay);
    break;
    }
    }


    System.out.println("**************************************************");
    } //计算时间差
    public long charge(String dstr1,String dstr2){
    long charge=0;
    SimpleDateFormat sd=new SimpleDateFormat("yyyy-MM-dd");
    try{
    Date d1=sd.parse(dstr1);
    Date d2=sd.parse(dstr2);
    charge=(d2.getTime()-d1.getTime())/(24*60*60*1000);
    }catch(ParseException e){
    e.printStackTrace();
    }
    return charge;
    }

         public void startMenu(){
    System.out.print("输入0返回主菜单:");
    if(sc.nextInt()==0)
    showMenu();
    }
    }
      

  2.   

    if(sd[i].name!=null)
    System.out.print(sd[i].name + " ");//这里仍然打印出null
      

  3.   

    先看个Testpublic class Test {
    public static void main(String[] args) {
    String[] str = {"a",null,"bb"};
    System.out.println(str[1]);
    System.out.println(str == null);
    System.out.println(str[1]==null);
    }
    }输出结果为null,false,true
    所以需要修改你代码的地方为
    1、for (int i = 0; i < sd.length; i++) {
    if(sd[i].name!=null)
          if(sd[i].name.equals(sd[i+1].name)){
     sd[i+1].name=null;//这里赋null有BUG,带求解!
     break;
       }
    }将=""改成=null,没有影响,因为如果是null,输出为null是正确输出
    2、//查看DVD
    public void lookBookMenu(DVD[] sd) {
    System.out.println("序号\t状态\t名称\t借出日期");
    for (int i = 0; i < sd.length; i++) {
    if((sd[i].name!=null)&&(sd[i].state==1))
         System.out.print((i+1)+"\t"+"已借出\t"+"《"+sd[i].name+"》\t"+sd[i].lendTime);
    if((sd[i].name!=null)&&(sd[i].state==0))
    System.out.print((i+1)+"\t"+"可借\t"+"《"+sd[i].name+"》\t");
    if(sd[i].name!=null)
        System.out.println();
    }

    }数组肯定不为null,需要数组元素判断是否为null
      

  4.   

    你说的太对了,不过,还不完整,你那样会有空引用异常,后来我改进了下,没有问题了。感谢!
    if((sd[i]!=null)&&(sd[i].name!=null))