我的Java程序遇到一些问题。我们必须创建一个库,其中包含标题(halo,lotr),格式(xbox,dvd等),借出日期(如果有过借出)和借出人(如果有过借出) )。

我还没有完成我的代码,但是在进行过程中我正在对其进行测试,而不是仅在编码5小时后才编译完整的完整代码。我遇到了问题。每当我将公共字符串变量设置为一个值时,它都会保存在我声明该变量的方法中,但在其他方法中将system.out.print打印出来时,它将显示“ null”。

这是我的代码。第一类是图书馆。

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。我不明白,因为我在程序的前面声明了它们!

我不明白我在做什么错。请帮我!谢谢!!

最佳答案

您的主要错误是您正在Library方法中创建MediaItem的新实例。该Library对象将仅存在于MediaItem方法的范围内。加Library是您的主要静态类。

我认为您的设计全错了。看来您正在学习使用Java或OOP的方法,完全可以解决这些错误。

将数据与主类分开,仅为数据创建新类。看一下Java POJO(普通的旧Java对象),例如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*/ }

09-05 10:00