web-dev-qa-db-fra.com

La méthode non statique ne peut pas être référencée à partir d'un contexte statique avec des méthodes et des variables

En écrivant une BookStoreApplication qui utilise les classes Book, Tape et CD pour créer des objets. Bien qu'elle ne soit pas terminée, la classe d'application doit créer de nouveaux BookStoreItems, qui sont Book, Tape et CD. Ils héritent de la classe BookStoreItems. Dans cette classe d'application, je reçois toujours l'erreur:

error: non-static method printMenu() cannot be referenced from a static context
error: non-static method getUserChoice() cannot be referenced from a static context
error: non-static variable input cannot be referenced from a static context

Je l'ai changé pour être statique et puis pour ne pas être statique, pourtant je continue à obtenir cette erreur ...

import Java.util.Scanner;

public class BookStoreApp2 {

    //constants for options
    static final int ADD_BOOK = 0;
    static final int ADD_TAPE = 1;
    static final int ADD_CD = 2;
    static final int QUIT = -1;

    Scanner input = new Scanner (System.in);

    public static void main(String[] args) {


        BookStoreItem[] item;//declaring array

        item = new BookStoreItem[10];//initializing array

        int itemType = -1;

        printMenu();
        getUserChoice();

        for (int i = 0; i < item.length; i++){
            System.out.print("\n" + i + "\tEnter 0 for Book, 1 for Tape, 2 for CD: ");
            itemType = input.nextInt();

            switch (itemType) {
                case 0:
                    item[i] = new Book();
                    break;
                case 1:
                    item[i] = new Tape();
                    break;
                case 2:
                    item[i] = new CD();
                    break;
                default: 
                    System.out.println("\nInvalid choice.");
            }//end of switch statement

        }//end of for loop

        for (int i = 0; i < item.length; i++) {
            System.out.println("\nAnimal #" + i + ": ");

            System.out.println("\n\tTitle: " + item[i].getTitle()); //polymorphic because they can operate on separate objects
            System.out.println("\n\tAuthor: " + item[i].getAuthor());
        }//end of for


    }//end of main method


//PRINT MENU----------------------------------------------------------  
    public void printMenu(){
        System.out.println("\nPress:");
        System.out.println("\t" + ADD_BOOK + "\tTo add a book to the book store.\n");
        System.out.println("\t" + ADD_TAPE + "\tTo add a tape to the book store.\n");
        System.out.println("\t" + ADD_CD + "\tTo add a CD to the book store.\n");
        System.out.println("\t" + QUIT + "\tTo exit\n");
    }
//---------------------------------------------------------------------
//GET USER CHOICE------------------------------------------------------ 
     public int getUserChoice() {
        int choice;     
        System.out.print("Please enter your choice: ");
        choice = input.nextInt();

        return choice;
    }//end of getUserChoice
//----------------------------------------------------------------------

}//end class
6
user1368970

Vous devez créer votre méthode - printMenu() et getUserChoice()static, car vous les invoquez directement depuis votre static main, sans créer une instance de la classe, ces méthodes sont définies dans. Et vous ne pouvez pas appeler un non-static méthode sans référence à une instance de la classe dans laquelle ils sont définis.

Vous pouvez également modifier la partie d'appel de méthode en:

BookStoreApp2 bookStoreApp = new BookStoreApp2();
bookStoreApp.printMenu();
bookStoreApp.getUserChoice();
17
Rohit Jain

Simplement dans le but de faire fonctionner votre programme, prenez le contenu de votre méthode main () et mettez-le dans un constructeur:

public BookStoreApp2()
{
   // Put contents of main method here
}

Ensuite, dans votre méthode main (). Faites ceci:

public void main( String[] args )
{
  new BookStoreApp2();
}
5
mightyrick

Tu peux soit

1) Déclarez printMenu(), getUserchoice() et entrez static

OR

2) Si vous souhaitez mieux le concevoir, déplacez la logique de votre main vers une méthode d'instance distincte. Et puis à partir de main créez une nouvelle instance de votre classe et appelez vos méthodes d'instance

2
Rohit

Vous devez placer Scanner input = new Scanner (System.in); dans la méthode principale plutôt que de créer l'objet d'entrée à l'extérieur.

1
jerryg311