问题点:
1.在使用测试类时,<<浪漫满屋>>这张DVD,明明已经设置为"未借出",可是偏偏显示就是"已经借出,操作不成功!"
2.我知道是DVDMgr类的lend()方法有问题,可就是找不到!请老师帮帮我!很头痛!!package Part2;public class DVDSet {
String[] name = new String[50];// 存储DVD名称
int[] state = new int[50];// 存储DVD状态 // 初始化
public void initial() {
name[0] = "罗马假日";
state[0] = 1;// “0”借出 ,"1"未借出
name[1] = "越狱";
state[1] = 1;
name[2] = "浪漫满屋";
state[2] = 1;
}}import java.util.*;public class DVDMgr {
DVDSet DVDSet_obj = new DVDSet();
Scanner s = new Scanner(System.in);
// 加载数据
public void setData() {
DVDSet_obj.initial();
} // 开始菜单
public void startMenu() {
System.out.println("欢迎使用MiniDVD Mgr 1.0");
System.out.println("- - - - - - - - - - - - - - - - - -"
+ " - - - - - - - - - - - - - - ");
System.out.println("1.查看DVD");
System.out.println("2.借出DVD");
System.out.println("3.退出MiniDVD Mgr");
System.out.println("- - - - - - - - - - - - - - - - - -"
+ " - - - - - - - - - - - - - - ");
System.out.println("请选择:"); switch (s.nextInt()) {
case 1:
System.out.println("查看DVD\n");
search();// 执行查询
break;
case 2:
System.out.println("借出DVD\n");
lend();// 标记借出
break;
case 3:
System.out.println("\n欢迎使用,谢谢!");
break; } } // 查询所有DVD信息
public void search() {
System.out.println("MyDVD Mgr 1.0------>查询DVD\n");
// 查询并输出
for (int i = 0; i < DVDSet_obj.name.length; i++) {
System.out.print("<<" + DVDSet_obj.name[i] + ">>"); if (DVDSet_obj.state[i] == 0) {
System.out.print("\t已借出");
} System.out.println();
}
System.out
.println("-------------------------------------------------------------------------------------");
returnMain();
} // 返回主菜单
public void returnMain() {
System.out.println("输入0返回");
if (s.nextInt()==1) {
startMenu();// 输入0返回主菜单 } else {
System.out.println("输入错误,异常终止!"); } } // 借出
public void lend() { System.out.println("MyDVD Mgr 1.0---->借出DVD\n");
System.out.println("请输出要借的DVD名称:"); for (int i = 0; i < DVDSet_obj.name.length; i++) {
// 如果输入的DVD名称与name[]数组的元素匹配,且对应的state[]状态为“1”输出操作成功
if (DVDSet_obj.name[i].equals(s.next()) && DVDSet_obj.state[i] == 1) { System.out.println("操作成功!");
DVDSet_obj.state[i] = 0;// 借出后,标记为"已借出" } else {
System.out.println("该DVD已借出,操作不成功!"); }
}
}}package Part2;public class test {
public static void main(String[] args) {
DVDMgr DVDMgr_obj = new DVDMgr();
DVDMgr_obj.setData();
DVDMgr_obj.startMenu();
}}
// 借出
public void lend() { System.out.println("MyDVD Mgr 1.0---->借出DVD\n");
System.out.println("请输出要借的DVD名称:");
String name = s.next(); boolean b = false;
int count = 0; for (int i = 0; i < DVDSet_obj.name.length; i++) {
// 如果输入的DVD名称与name[]数组的元素匹配,且对应的state[]状态为“1”输出操作成功
if (DVDSet_obj.name[i].equals(name) && DVDSet_obj.state[i] == 1) {
b = true;
count = i;
break;
}
} if (b) {
System.out.println("操作成功!");
DVDSet_obj.state[count] = 0;// 借出后,标记为"已借出"
} else {
System.out.println("该DVD已借出,操作不成功!");
b = false;
}
}
// 如果输入的DVD名称与name[]数组的元素匹配,且对应的state[]状态为“1”输出操作成功
if (DVDSet_obj.name[i].equals(s.next()) && DVDSet_obj.state[i] == 1) { System.out.println("操作成功!");
DVDSet_obj.state[i] = 0;// 借出后,标记为"已借出" } else {
System.out.println("该DVD已借出,操作不成功!"); }
} 你数组里第一个元素是罗马假日,所以你输入浪漫满屋的时候已经到else里去了,呵呵
// 如果输入的DVD名称与name[]数组的元素匹配,且对应的state[]状态为“1”输出操作成功
if (DVDSet_obj.name[i].equals(s.next()) && DVDSet_obj.state[i] == 1) { System.out.println("操作成功!");
DVDSet_obj.state[i] = 0;// 借出后,标记为"已借出" } else {
System.out.println("该DVD已借出,操作不成功!"); }
} 你数组里第一个元素是罗马假日,所以你输入浪漫满屋的时候已经到else里去了,呵呵
boolean findFlag = false;
for (int i = 0; i < DVDSet_obj.name.length; i++) {
// 如果输入的DVD名称与name[]数组的元素匹配,且对应的state[]状态为“1”输出操作成功
if (DVDSet_obj.name[i].equals(s.next()){
findFlag = true;
if(DVDSet_obj.state[i] == 1){
System.out.println("操作成功!");
DVDSet_obj.state[i] = 0;// 借出后,标记为"已借出"
break;
}else{
System.out.println("该DVD已借出,操作不成功!");
}
}
}
if(!findFlag){
System.out.println("该DVD不存在!!");
}
1.当设定“罗马假日”state[]为“0”已借出的话
2.运行test,显示为空指针异常.
所以在lend方法的循环中就会循环50次:for (int i = 0; i < DVDSet_obj.name.length; i++) {
// 如果输入的DVD名称与name[]数组的元素匹配,且对应的state[]状态为“1”输出操作成功
if (DVDSet_obj.name[i].equals(name) && DVDSet_obj.state[i] == 1) {
b = true;
count = i;
break;
}
}当循环到第四次的时候,取的DVDSet_obj.name[i]就是null了,你用它来.equals肯定会报空指针了。解决办法:
将DVDSet类改成:public class DVDSet { String[] name = null;// 存储DVD名称 int[] state = null;;// 存储DVD状态 // 初始化
public void initial() { name = new String[3];
name[0] = "罗马假日";
name[1] = "越狱";
name[2] = "浪漫满屋"; state = new int[3];
state[0] = 0;// “0”借出 ,"1"未借出
state[1] = 1;
state[2] = 1;
}
}
我是这样做的,在lend()方法中首先判断name[]数组是否为null,再进行后面动作.
for (int i = 0; i < DVDSet_obj.name.length; i++) {
// 如果输入的DVD名称与name[]数组的元素匹配,且对应的state[]状态为“1”输出操作成功
if (DVDSet_obj.name[i] != null) {
if (DVDSet_obj.name[i].equals(name) && DVDSet_obj.state[i] == 1
&& !DVDSet_obj.name[i].equals(null)) {
b = true;
count = i;
break;
}
} }