Как я могу получить ошибку, нестатический метод GetString (Scanner, String) не может быть указан из статического контекста, чтобы уйти?

Я работаю с двумя классами. Один называется Validator, а другой — LineItemApp.

Вот код класса Validator.

import java.util.Scanner;

public class Validator
{
public String getString(Scanner sc, String prompt)
{
    System.out.print(prompt);
    String s = sc.next();  // read user entry
    sc.nextLine();  // discard any other data entered on the line
    return s;
}

public int getInt(Scanner sc, String prompt)
{
    int i = 0;
    boolean isValid = false;
    while (isValid == false)
    {
        System.out.print(prompt);
        if (sc.hasNextInt())
        {
            i = sc.nextInt();
            isValid = true;
        }
        else
        {
            System.out.println("Error! Invalid integer value. Try again.");
        }
        sc.nextLine();  // discard any other data entered on the line
    }
    return i;
}

public int getInt(Scanner sc, String prompt,
int min, int max)
{
    int i = 0;
    boolean isValid = false;
    while (isValid == false)
    {
        i = getInt(sc, prompt);
        if (i <= min)
            System.out.println(
                "Error! Number must be greater than " + min + ".");
        else if (i >= max)
            System.out.println(
                "Error! Number must be less than " + max + ".");
        else
            isValid = true;
    }
    return i;
}

public double getDouble(Scanner sc, String prompt)
{
    double d = 0;
    boolean isValid = false;
    while (isValid == false)
    {
        System.out.print(prompt);
        if (sc.hasNextDouble())
        {
            d = sc.nextDouble();
            isValid = true;
        }
        else
        {
            System.out.println("Error! Invalid decimal value. Try again.");
        }
        sc.nextLine();  // discard any other data entered on the line
    }
    return d;
}

public double getDouble(Scanner sc, String prompt,
double min, double max)
{
    double d = 0;
    boolean isValid = false;
    while (isValid == false)
    {
        d = getDouble(sc, prompt);
        if (d <= min)
            System.out.println(
                "Error! Number must be greater than " + min + ".");
        else if (d >= max)
            System.out.println(
                "Error! Number must be less than " + max + ".");
        else
            isValid = true;
    }
    return d;
}
}

Вот мой класс LineItemApp

    import java.util.Scanner;

public class LineItemApp
{
public static void main(String args[])
{
    // display a welcome message
    System.out.println("Welcome to the Line Item Calculator");
    System.out.println();

    // create 1 or more line items
    Scanner sc = new Scanner(System.in);
    String choice = "y";
    while (choice.equalsIgnoreCase("y"))
    {
        // get the input from the user
        String productCode = Validator.getString(sc,
            "Enter product code: ");
        int quantity = Validator.getInt(sc,
            "Enter quantity:     ", 0, 1000);

        // get the Product object
        Product product = ProductDB.getProduct(productCode);

        // create the LineItem object
        LineItem lineItem = new LineItem(product, quantity);

        // display the output
        System.out.println();
        System.out.println("LINE ITEM");
        System.out.println("Code:        " + product.getCode());
        System.out.println("Description: " + product.getDescription());
        System.out.println("Price:       " + product.getFormattedPrice());
        System.out.println("Quantity:    " + lineItem.getQuantity());
        System.out.println("Total:       " +
            lineItem.getFormattedTotal() + "\n");

        // see if the user wants to continue
        choice = Validator.getString(sc, "Continue? (y/n): ");
        System.out.println();
    }
}

}

Любая помощь будет принята с благодарностью.

Спасибо, Дэвид


person user2589551    schedule 17.07.2013    source источник
comment
вероятно, на такие вопросы отвечают раньше and-va" title="на нестатический метод нельзя ссылаться из статического контекста с помощью методов и va">stackoverflow.com/questions/14862306/   -  person Black Maggie    schedule 17.07.2013
comment
Либо вызовите статический метод, либо ссылайтесь на него из нестатического контекста.   -  person Hot Licks    schedule 17.07.2013
comment
(Или, по крайней мере, указать, какая строка вызвала ошибку.)   -  person Hot Licks    schedule 17.07.2013


Ответы (3)


Вам нужен экземпляр Validator, чтобы ввести методы

// see if the user wants to continue
    Validator validator = new Validator();
    choice = validator.getString(sc, "Continue? (y/n): ");
    System.out.println();

Или, как предлагается в другом ответе, вы можете сделать методы валидатора статическими, но это изменение, безусловно, больше, и вам нужно изменить код, и вы не знаете, используете ли вы этот валидатор в другой части, поэтому я не согласен, но если вы хотите провести рефакторинг это, совсем неплохая идея, потому что ваш класс Validator не имеет состояния, только некоторые алгоритмы.

person nachokk    schedule 17.07.2013
comment
Большое спасибо. Делаю ли я то же самое, где написано String productCode = Validator.getString(sc, Enter product code: ); А также в количестве int = Validator.getInt(sc, введите количество: ,0,1000); Я читал, что int как-то отличается, когда дело доходит до создания и экземпляра. Это новое для меня, и я с трудом понимаю это. - person user2589551; 17.07.2013
comment
да, вам нужен объект для доступа к нестатическим методам, если вы поместите Validator.someMethod();, это означает, что класс Validator имеет class level method (статический). - person nachokk; 17.07.2013
comment
Ok. Я все еще теряюсь, пытаясь сделать то же самое для String productCode = Validator.getString(sc, Введите код продукта:) Он продолжает выдавать мне ошибку, когда я пытаюсь его изменить. - person user2589551; 17.07.2013
comment
@user2589551 user2589551 вам нужно определить Validator validator = new Validator(); главное, java читает сверху вниз;) - person nachokk; 17.07.2013
comment
Ха-ха, я должен был это знать -_-. Во всяком случае, то же самое с переменной int? - person user2589551; 17.07.2013
comment
@user2589551 user2589551 не понимаю, если вы имеете в виду объявление сначала использовать позже? да, сначала вам нужно объявить переменную, чтобы использовать ее в методе. - person nachokk; 17.07.2013
comment
Хорошо, спасибо за всю вашу помощь. Не могли бы вы помочь мне еще в одном деле. Мне нужно добавить конструктор в класс валидатора, который не принимает аргументов. Это выглядит довольно просто, но мой синтаксис отключен. - person user2589551; 17.07.2013
comment
по умолчанию всегда неявно, но если вы хотите сделать что-то внутри, вы объявляете public Validator(){ //code here} ; - person nachokk; 17.07.2013

Вы вызываете нестатические методы из статического метода (который теперь называется main() ).

Вы можете устранить ошибку, объявив методы, вызывающие предупреждение, статическими.

person Black Maggie    schedule 17.07.2013
comment
проблема в том, что у него нет экземпляра Validator или getString не является статическим.. - person nachokk; 17.07.2013

Вы должны понимать, что такое статический метод. http://www.leepoint.net/notes-java/flow/methods/50static-methods.html

person WindyYang    schedule 17.07.2013