我遇到了Java程序的一些问题。我们必须创建一个库,其中包含标题(光环,lotr),格式(xbox,dvd等),借出的日期(如果它曾被借出),以及借给它的人(如果它曾被借出过) )。
我没有完成我的代码,但是我正在测试它,而不是仅仅在编码5个小时后编译完整的代码。我遇到了一个问题。每当我将一个公共字符串变量设置为一个值时,它会保存在我声明它的方法中,但它会显示" null"当system.out.print在其他方法中时。
继承我的代码。头等舱是图书馆。
package p1;
import java.util.Scanner;
public class Library {
// \/ FIELDS
private String[] mediaItemTitle = new String[100];
public String[] mediaItemFormat = new String[100];
public String[] mediaItemLoanedTo = new String[100];
public String[] mediaItemOnLoan = new String[100];
public String[] mediaItemDateLoaned = new String[100];
public String today = "3/9/2015";
public int numberOfItems;
// /\ FIELDS
// \/ METHODS
public static void main(String[] brad){
Scanner input = new Scanner(System.in);
MediaItem main;
main = new MediaItem();
String title;
String format;
String date;
String name;
for ( int i = 0; i != 5; ){
i = displayMenu();
if (i == 1){
System.out.println("What is the title? ");
title = input.nextLine();
System.out.println("What is the format? ");
format = input.nextLine();
main.MediaItem(title,format);
}else if (i == 2){
System.out.println("Which Item (Enter the title? ");
title = input.nextLine();
System.out.println("Who are you loaning it to? ");
name = input.nextLine();
System.out.println("When did you loan it to them? ");
date = input.nextLine();
}else if (i == 3){
main.MediaItem();
}else if (i == 4){
System.out.print("Which item? (enter the title) ");
title = input.nextLine();
main.markReturned(title);
}else if (i == 5){ // DONE
System.out.print("Goodbye!");
break;
}
}
}
public static int displayMenu(){ // DONE
Scanner input = new Scanner(System.in);
int choice = 0;
System.out.println("1. Add new item");
System.out.println("2. Mark an item as on loan");
System.out.println("3. List all items");
System.out.println("4. Mark an item as returned");
System.out.println("5. Quit");
choice = input.nextInt();
return choice;
}
public void addNewItem(String title, String format){
this.mediaItemTitle[numberOfItems] = title;
this.mediaItemFormat[numberOfItems] = format;
System.out.print("TEST: " + mediaItemTitle[numberOfItems]);
}
public void incrementNumberOfItems(){
numberOfItems++;
}
public void listAllItems(){
for (int i = 0; i < numberOfItems; i++){
System.out.print(mediaItemTitle[i])
}
} 这是代码的第二部分,我的第二类MediaItem 包p1;
公共类MediaItem {
// \/ METHODS
public void MediaItem(){
Library list;
list = new Library();
list.listAllItems();
}
public void MediaItem(String title, String format){
Library call;
call = new Library();
call.addNewItem(title, format);
call.incrementNumberOfItems();
}
// /\ METHODS
}
这让我疯了。我很乐意让公共变量在方法之间保存它们的价值,但它没有发生。控制台(当从displayMenu中选择3时)
0 空
表示numberOfItems和mediaItemTitle [i]被读为0,并且为null。我不明白,因为我在节目中早些时候宣布了它们!
我不明白我做错了什么。请帮我!谢谢!!
答案 0 :(得分:1)
您的主要错误是您在Library
方法中创建了MediaItem
的新实例。该Library
对象仅存在于MediaItem
方法的范围内。加Library
是您的主要静态类。
我认为你的设计完全错了。看起来你正在学习Java或OOP,这对于犯这些错误是完全没问题的。
将您的数据与主类分开,仅为您的数据创建新类。看看java POJO(Plain Old Java Objects),比如here
例如:
String title;
String format;
String date;
String name;
应该是一个新的对象,一个POJO。类似的东西:
public class MyDataPOJO {
private String title;
private String format;
private String date;
private String name;
public MyDataPOJO(String title, String format, String date, String name) {
this.title = title;
this.format = format;
this.date = date;
this.name = name;
}
public String getTitle() {return title;}
public String getFormat() {return formate;}
// And the rest of the getter methods for date and name
}
在Library
课程中,您可能只需要掌握自己的逻辑。但即使这样也可以重新考虑到另一个班级。
另外,请查看java命名约定。这是一个指南:link。换句话说,用小写启动方法名称。
例如,您的public void MediaItem(){/** something*/}
应为public void mediaItem(){/** something*/ }
答案 1 :(得分:0)
按照上面的答案并将其视为评论,因为人员回答是正确的,我的陈述不是关于您的主要问题。
在你的for循环中,我认为你应该添加另一个if语句。如果用户输入的数字不是1-5,则应收到错误。也许像
这样的东西else if (i < 1 || i > 5)
System.out.println("Error: Enter a choice 1-5\n");
另外,我想您可能已经忘记了}结束listAllItems()方法。
但正如我所说,你的真实问题的答案已经得到处理,所以给他们一个复选标记。这只是我注意到的一个小的UI错误。