初级Java静态作用域错误



(对于初学者Java类)赋值指定我只生成一个Scanner实例,并且我需要在多个方法中使用它,所以我在main之外声明了它。我声明了一个数组,并试图将其等同于方法调用initialCash(),就像在Python中一样。问题是,如果我使initialCash方法静态,我就不能使用Scanner。如果initialCash()不是静态的,Eclipse会善意地告诉我它"不能对非静态方法进行静态引用";行)我该如何解决这个问题?

package proj1;
import java.util.Scanner;
public class Project1 
{
    Scanner scanner = new Scanner(System.in);
    public static void main(String[] args) 
    {
        int[] money = new int[4]; 
        money = initialCash();
    }   
    public int[] initialCash()
    {
        int[] initialMoney = new int[4];
        while(true)
        {
            System.out.print("Ones: ");
            initialMoney[0] = scanner.nextInt();
            System.out.print("Fives: ");
            initialMoney[1] = scanner.nextInt();
            System.out.print("Tens: ");
            initialMoney[2] = scanner.nextInt();
            System.out.print("Twenties: ");
            initialMoney[3] = scanner.nextInt();
            if((initialMoney[0]>=0)&&(initialMoney[1]>=0)&&(initialMoney[2]>=0)&&(initialMoney[3]>0))    
            {
                return initialMoney;
            }
            else
            {
                System.out.println("One or more invalid denominations. Try again.");
            }
        }
    }

}

创建一个类的实例,并从main调用该实例上的initialCash。

money = new Project1().initialCash();

PermGenError所说的肯定有效,或者您可以将initalCash()方法和scanner引用变量都设置为静态。

在您的代码中,行

Scanner scanner = new Scanner(System.in);

每次创建类型为Project1的对象时,都会创建一个新的Scanner对象。而如果你把它写成

static Scanner scanner = new Scanner(System.in);

它将创建一个Scanner实例,供引用该对象的所有类使用。在你提到的问题中,必须只有一个扫描仪对象,如果是这样的话,这就是方法。

如果您使用

money = new Project1().initialCash();

您正在创建一个新的Project1对象和一个新Scanner对象,如果您要通过调用另一个函数来重用Scanner对象,因为它与Project1的特定实例绑定,所以我建议您将其设为static,与initialCash函数相同,它与该对象实例绑定。

使Scanner和initialMoney方法保持静态。这应该可以解决你的问题。

static Scanner scanner = new Scanner(System.in);
public static void main(String[] args)
{
    int[] money = new int[4];
    money = initialCash();
}
public static int[] initialCash()
{
    int[] initialMoney = new int[4];
    while(true)
    {
        System.out.print("Ones: ");
        initialMoney[0] = scanner.nextInt();
        System.out.print("Fives: ");
        initialMoney[1] = scanner.nextInt();
        System.out.print("Tens: ");
        initialMoney[2] = scanner.nextInt();
        System.out.print("Twenties: ");
        initialMoney[3] = scanner.nextInt();
        if((initialMoney[0]>=0)&&(initialMoney[1]>=0)&&(initialMoney[2]>=0)&&(initialMoney[3]>0))
        {
            return initialMoney;
        }
        else
        {
            System.out.println("One or more invalid denominations. Try again.");
        }
    }
}

最新更新