【问题标题】:Cannot make a static reference to the non-static method Library无法对非静态方法库进行静态引用
【发布时间】:2023-04-02 15:27:01
【问题描述】:

我的教授拒绝告诉我我做错了什么,而我这辈子都想不通。我刚开始java,所以我可能看起来很愚蠢,但是

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;
        }
    }
}
}

我在整个代码中都遇到了这个问题,但我想如果你们能回答这个问题,我可以自己解决剩下的问题。 编辑:我走得更远了,现在我只需要弄清楚为什么它没有读取名称和日期。

【问题讨论】:

  • 对不起,主题与描述无关
  • 对于这个 MediaItem 类需要发布
  • 看这里,当您从静态块调用非静态方法时,通常会出现此错误。现在的问题是,这为什么以及如何重要?为此,您需要了解类加载以及类加载期间会发生什么,首先加载的变量或方法是什么等。我想我已经给了您足够的提示。祝你好运。
  • 请告诉我这是两个无关代码的sn-ps。如果您的方法Library 不是静态的,则您需要一个具有调用它的方法的任何类的实例(或者您创建方法static)。无论如何,您还没有发布足够多的代码来说明更多内容。
  • 我发布了 Library 类的其余部分,如果您需要 MediaItem 类,请告诉我。

标签: java class methods static non-static


【解决方案1】:

在您的 switch 语句中,您调用了未声明为静态的 addNewItem。

为了调用 addNewItem,你必须有一个 Object 来调用它,除非你声明它是静态的,或者调用 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 修饰符,则需要有一个类的实例来访问方法、字段或类。

有关一个很好的例子,请参阅:https://stackoverflow.com/a/15828090/1732480

编辑:在您发布更多代码后,您没有可以调用 addNewItem 的库实例。 使用Library l = new Library(); 创建一个库并调用l.addNewItem()

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;
         ....

【讨论】:

  • 在使用您的建议之后,我现在在 midterm.Library 的 midterm.Library.markItemOnLoan(Library.java:25) 处收到错误消息“线程“main”java.lang.NullPointerException 中的异常。 main(Library.java:88)' 当我到达“markItemAsLoaned”时
  • 这是您代码中的另一个错误。我不会为你做所有的功课。 ;) 看起来您正在使用 eclipse,在方法 markItemAsLoaned 的代码中设置断点,并逐步检查代码以检查每个变量的值。提示:我感觉其中一项没有设置为正确的值。另外,您是否有任何理由在循环结束时而不是在 for 语句中递增(错误在循环中。
  • 它不会读取名称和日期。我所做的任何事情都无法解决。我想如果我把 i++ 放在循环的末尾,它会阻止它弄乱它与“numberOfItems”的连接
  • @TimKoehler 我觉得你的问题比最初提出的要多。这不是一个问题,而是众包错误修复的尝试。您没有足够的信息来彻底弄清楚发生了什么。附上输入、输出和堆栈跟踪,我也许可以帮助你。
  • 看来代码的问题比我原先想的要多。
猜你喜欢
  • 2011-06-25
  • 2013-06-30
  • 2014-06-08
  • 2013-03-31
相关资源
最近更新 更多