Java 无法对非静态方法库进行静态引用
我的教授拒绝告诉我我做错了什么,我一辈子都搞不清楚。我刚刚开始使用java,所以我可能看起来很傻,但是Java 无法对非静态方法库进行静态引用,java,class,methods,static,non-static,Java,Class,Methods,Static,Non Static,我的教授拒绝告诉我我做错了什么,我一辈子都搞不清楚。我刚刚开始使用java,所以我可能看起来很傻,但是 import java.util.Scanner; public class Library { MediaItem[] items = new MediaItem[100]; int numberOfItems = 0; static int displayMenu(){ @SuppressWarnings("resource") S
import java.util.Scanner;
public class Library {
MediaItem[] items = new MediaItem[100];
int numberOfItems = 0;
static int displayMenu(){
@SuppressWarnings("resource")
Scanner dog = new Scanner(System.in);
System.out.println("Menu:\n1:Add New Item\n2:Mark Item as Loaned\n3:List All Items\n4:Mark Item as Returned\n5:Quit");
int cat = dog.nextInt();
return cat;
}
void addNewItem(String title, String format){
MediaItem item = new MediaItem();
item.setTitle(title);
item.setFormat(format);
items[numberOfItems] = item;
numberOfItems++;
}
void markItemOnLoan(String title, String name, String date){
for (int i=0;i<numberOfItems;i++){
MediaItem item = items[i];
String title5 = item.getTitle();
if (title5 == title){
item.markOnLoan(name, date);
i=numberOfItems;
}
}
}
String[] listAllItems(){
String[] all = new String[numberOfItems];
for (int i=0;i<numberOfItems;i++){
MediaItem item = items[i];
if (item.onLoan=true){
all[i]=item.getTitle()+" "+item.getFormat()+" "+item.getOnLoan()+" "+item.getLoanedTo()+" "+item.getDateLoaned()+" ";
}else{
all[i]=item.getTitle()+" "+item.getFormat()+" "+item.getOnLoan()+" ";
}
}
return all;
}
void markItemReturned(String title){
for (int i=0;i<numberOfItems;i++){
MediaItem item = items[i];
String title1 = item.getTitle();
if (i==numberOfItems){
System.out.println("Title not found.");
}else if (title1 == title){
item.markReturned();
i=numberOfItems;
}
}
}
public static void main(String[] args) {
Library banana = new Library();
String invalid = "Invalid Option";
@SuppressWarnings("resource")
Scanner dog = new Scanner(System.in);
for (int i=0; i==0;){
int cat = displayMenu();
if (cat<=0){
System.out.println(invalid);
}
if (cat>=6){
System.out.println(invalid);
}
switch (cat){
case 1:
System.out.println("What is the title of the item?");
String title = dog.nextLine();
System.out.println("What is the format of the item?");
String format = dog.nextLine();
banana.addNewItem(title, format);
break;
case 2:
System.out.println("What is the title of the item?");
String title1 = dog.nextLine();
System.out.println("What is your name?");
String name = dog.nextLine();
System.out.println("What is the date?");
String date = dog.nextLine();
banana.markItemOnLoan(title1, name, date);
break;
case 3:
String[] list = banana.listAllItems();
System.out.println("List of all items:\n");
for (int o=0;o<banana.numberOfItems;o++){
System.out.println(list[o]);
}
break;
case 4:
System.out.println("What is the title you are returning?");
String title2 = dog.nextLine();
banana.markItemReturned(title2);
break;
case 5:
i++;
break;
}
}
}
}
我的代码中都有这个问题,但我想如果你们能回答这个问题,我可以自己解决剩下的问题。
编辑:我想说得更进一步,现在我只需要弄清楚它为什么不读取名称和日期。在switch语句中,调用addNewItem,它不是声明为静态的 为了调用addNewItem,您必须有一个对象来调用它,除非您声明它是静态的,或者调用obj.addNewItem。您没有包含太多代码,所以我不确定对象应该是什么类
static void addNewItem(String title, String format){
MediaItem item = new MediaItem();
item.setTitle(title);
item.setFormat(format);
items[numberOfItems] = item;
numberOfItems++;
}
static关键字表示方法、字段或类只有一个实例,即使没有与之关联的类的实例。如果没有static修饰符,则需要有类的实例才能从中访问方法、字段或类
有关良好的示例,请参见:
编辑:发布更多代码后,您没有可调用addNewItem的库实例。
创建一个库,库l=新库;并调用l.addNewItem
抱歉,该主题与Description没有关联,需要对此MediaItem类进行postedLook此处通常在从静态块调用非静态方法时出现此错误。现在的问题是,这有什么关系?为此,您需要了解类加载以及在类加载期间发生的事情,首先加载的变量或方法是什么等等。我想我已经给了您足够的提示。祝你好运。请告诉我这是两段不相关的代码。如果您的方法库不是静态的,那么您需要任何类的实例来调用它,或者使该方法成为静态的。无论如何,你没有发布足够的代码来说明更多。我发布了库类的其余部分,如果您需要MediaItem类,请告诉我。在使用您的建议之后,我现在收到错误消息“Exception in thread main java.lang.NullPointerException at midterm.Library.markItemOnLoanLibrary.java:25 at midterm.Library.mainLibrary.java:88”,当我到达MarkItemAsLoaned时,这是代码中的另一个错误。我不会为你做所有的家庭作业;看起来您正在使用eclipse,在方法markItemAsLoaned的代码中设置一个断点,然后逐步检查代码以检查每个变量的值。提示:我感觉其中一项没有设置为正确的值。另外,是否有任何原因使您在循环结束时而不是在语句中递增,因为错误在循环中vs不会读取名称和日期。我所做的一切都不能解决它。我想如果我把I++放在循环的末尾,它就不会弄乱它的连接numberOfItems@TimKoehler我觉得你的问题比最初问的要多。这与其说是一个问题,倒不如说是一次众包bug修复的尝试。你没有足够的信息来彻底弄清楚发生了什么。附加输入、输出和stacktrace,我可能会帮助您。代码中的问题似乎比我最初认为的要多。
public static void main(String[] args) {
Library l = new Library();
String invalid = "Invalid Option";
Scanner dog = new Scanner(System.in);
for (int i=0; i==0;){
int cat = displayMenu();
if (cat<=0){
System.out.println(invalid);
}
if (cat>=6){
System.out.println(invalid);
}
switch (cat){
case 1:
System.out.println("What is the title of the item?");
String title = dog.nextLine();
System.out.println("What is the format of the item?");
String format = dog.nextLine();
l.addNewItem(title, format);
break;
....