我在学校写的一个程序,遇到一个BUG求解!

sea000sea 2013-06-13 12:09:13
程序是一个关于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”这个符号来。让我很无解,无语。求各位大侠帮忙!!!小弟在此感谢你们了!
...全文
190 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
sea000sea 2013-06-13
  • 打赏
  • 举报
回复
菜单类更改下:
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();
	}
}
「已注销」 2013-06-13
  • 打赏
  • 举报
回复
先看个Test
public 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
sea000sea 2013-06-13
  • 打赏
  • 举报
回复
引用 2 楼 flagiris 的回复:
if(sd[i].name!=null) System.out.print(sd[i].name + " ");//这里仍然打印出null
你说的太对了,不过,还不完整,你那样会有空引用异常,后来我改进了下,没有问题了。感谢! if((sd[i]!=null)&&(sd[i].name!=null))
菖蒲老先生 2013-06-13
  • 打赏
  • 举报
回复
if(sd[i].name!=null) System.out.print(sd[i].name + " ");//这里仍然打印出null

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧