非静态变量不能在Java的静态上下文中引用此变量

非静态变量不能在Java的静态上下文中引用此变量,java,compiler-errors,nullpointerexception,inner-classes,non-static,Java,Compiler Errors,Nullpointerexception,Inner Classes,Non Static,我不明白为什么这段代码会给我带来问题,因为我在outclass中声明了新实例 以下是我对这个问题的解决方案(UvA-103): 最初,我得到的是NullPointerException的运行时错误: C:\Users\User\Desktop\103-StackingBoxes>java Main 5 2 Exception in thread "main" java.lang.NullPointerException at Main.main(Main.java:27)

我不明白为什么这段代码会给我带来问题,因为我在outclass中声明了新实例

以下是我对这个问题的解决方案(UvA-103):

最初,我得到的是NullPointerException的运行时错误:

C:\Users\User\Desktop\103-StackingBoxes>java
Main
5 2

Exception in thread "main" java.lang.NullPointerException
        at Main.main(Main.java:27)
我修复了这个问题,但现在我得到了以下编译错误:

C:\Users\User\Desktop\103-StackingBoxes>javac
 Main.java
Main.java:28: error: non-static variable this cannot be referenced from a static
 context
                                boxArray[i] = new box();
                                              ^
1 error
我知道Java通常避免使用内部类,但我不明白为什么我的语句不起作用

import java.util.*;
import java.io.*;
//import java.util.Arrays;

public class Main
{

    public static void main(String args[])
    {

        Scanner input = new Scanner(System.in);
        int k,n;

        while(input.hasNext())
        {
            System.out.printf("\n");
            k = input.nextInt();
            n = input.nextInt();

            // box boxArray[] = new box(n)[k];
            box[] boxArray = new box[k];

            for(int i =0; i< k; i++)
            {
                boxArray[i] = new box();
                //boxArray[i] = boxArray[i].box(n);
                boxArray[i].totalDim = n;
                for(int j =0; j < n; j++)
                {
                    boxArray[i].dimensions[j]=input.nextInt();
                }
            }


            boxArray = sortBoxArray(boxArray);

            int count = 1;
            for(int i =k-1; i > 1 ; i--)
            {
                if(boxArray[i].doesArgBoxFitInside(boxArray[i-1]))
                    count++;
                else
                    break;
            }

            System.out.printf("%d\n",count);
            for(int i = k-count; i < k ; i++)
            {
                if(i == k-1)
                    System.out.printf("%d",boxArray[i].placeNumber);
                else
                    System.out.printf("%d ",boxArray[i].placeNumber);
            }


        }

    }

    public static box[] sortBoxArray(box[] boxArray)
    {
        for(int i = 1; i < boxArray.length; i++)
        {
            for(int j = boxArray.length-1; j>=i; j++)
            {
                boolean skip = false;
                for(int k = 0; k < boxArray[j].totalDim; k++)
                {
                    if(boxArray[j].dimensions[k]<boxArray[j].dimensions[k-1])
                    {
                        box temp = boxArray[j-1];
                        boxArray[j-1] = boxArray[j];
                        boxArray[j]=temp;
                    }   
                }
            }
        }

        return boxArray;
    }


    public class box{

        /*******************************************Fields***********************************************/
        public int totalDim;
        public int dimensions[];
        //The field I forgot about
        public int placeNumber;

        /*******************************************Methods**********************************************/
        public box()
        {
            this.totalDim = -1;
            this.dimensions= new int[0];
            this.placeNumber = -1;
        }

        public box(int totalDim)
        {
            this.totalDim = totalDim;
            this.dimensions = new int[totalDim];
        }

        //public box(int totalDim, int[totalDim] dimensions)
        public box(int totalDim, int[] dimensions)
        {
            this.totalDim = totalDim;
            this.dimensions = dimensions;
            sortDim();

        }

        public void sortDim()
        {
            Arrays.sort(dimensions);        
        }

        public boolean doesArgBoxFitInside(box wop)
        {
            if(this.totalDim != wop.totalDim)
                return false;
            else
            {
                for(int i =0; i < totalDim; i++)
                {
                    if(this.dimensions[i]<wop.dimensions[i])
                        return false;
                }
                return true;
            }
        }
    }   
}
import java.util.*;
导入java.io.*;
//导入java.util.array;
公共班机
{
公共静态void main(字符串参数[])
{
扫描仪输入=新扫描仪(System.in);
int k,n;
while(input.hasNext())
{
System.out.printf(“\n”);
k=input.nextInt();
n=input.nextInt();
//box-boxArray[]=新的box(n)[k];
box[]boxArray=新框[k];
for(int i=0;i1;i--)
{
if(boxArray[i].doesArgBoxFitInside(boxArray[i-1]))
计数++;
其他的
打破
}
System.out.printf(“%d\n”,计数);
for(int i=k计数;i=i;j++)
{
布尔跳跃=假;
对于(int k=0;k如果(boxArray[j].dimensions[k]您的类
box
(请遵守Java的大写类名编码约定!)是一个内部类,并且对于静态代码不可见:

“InnerClass的实例只能存在于OuterClass的实例中,并且可以直接访问其封闭实例的方法和字段。 要实例化内部类,必须首先实例化外部类。然后,使用以下语法在外部对象内创建内部对象: OuterClass.InnerClass innerObject=outerObject.new InnerClass() ()


您的类
(请遵守Java的大写类名编码约定!)是一个内部类,对于静态代码不可见:

“InnerClass的实例只能存在于OuterClass的实例中,并且可以直接访问其封闭实例的方法和字段。 要实例化内部类,必须首先实例化外部类。然后,使用以下语法在外部对象内创建内部对象: OuterClass.InnerClass innerObject=outerObject.new InnerClass() ()


您的类
(请遵守Java的大写类名编码约定!)是一个内部类,对于静态代码不可见:

“InnerClass的实例只能存在于OuterClass的实例中,并且可以直接访问其封闭实例的方法和字段。 要实例化内部类,必须首先实例化外部类。然后,使用以下语法在外部对象内创建内部对象: OuterClass.InnerClass innerObject=outerObject.new InnerClass() ()


您的类
(请遵守Java的大写类名编码约定!)是一个内部类,对于静态代码不可见:

“InnerClass的实例只能存在于OuterClass的实例中,并且可以直接访问其封闭实例的方法和字段。 要实例化内部类,必须首先实例化外部类。然后,使用以下语法在外部对象内创建内部对象: OuterClass.InnerClass innerObject=outerObject.new InnerClass() ()


问题是:您的box类是Main类的内部类,正如@Smutje所指出的,内部类对静态方法不可见。原因是:即使没有类的实例,也可以执行静态方法,而内部类对象只能存在于有外部类的对象的情况下,所以这两条语句有点相反因此,内部类不能在静态方法中直接访问

修复:

可以将Box类设置为静态,也可以在创建外部类的对象后创建Box类的实例

第二种解决方案的代码:

    Main obj = new Main();
    for(int i =0; i< k; i++)
    {
        boxArray[i] = obj.new box();
Main obj=new Main();
for(int i=0;i
问题是:您的box类是主类的内部类,正如@Smutje所指出的,内部类对静态方法不可见。原因是:即使没有类的实例,也可以执行静态方法,并且只有存在外部类的对象时,内部类对象才能存在,所以这两条语句在某种程度上是共同的因此,在静态方法中不能直接访问内部类

修复:

可以将Box类设置为静态,也可以在创建外部类的对象后创建Box类的实例

第二种解决方案的代码:

    Main obj = new Main();
    for(int i =0; i< k; i++)
    {
        boxArray[i] = obj.new box();
Main obj=new Main();
for(int i=0;i
问题是:您的box类是主类的内部类,正如@Smutje所指出的那个内部类