非静态方法getAssets无法从静态上下文(Java)引用(Android)

时间:2017-04-18 20:23:11

标签: java android static

我试图创建一个方法,将文本从txtfile转换为String。当我从它所在的同一个类中调用它时,该方法正在工作(该类是一个活动)。但是当我从另一个类(普通类)调用它时,它需要是静态的。而且我对静态知之甚少,但该方法在静态时无效。因为我需要从另一个类调用该方法,所以我要么需要该方法是非静态的,要么在它是静态时修复错误。这是方法:

public static String loadData(String inFile) {
    String str = "";
    try{
        StringBuilder buf=new StringBuilder();
        InputStream json= getAssets().open(inFile);
        BufferedReader in=
                new BufferedReader(new InputStreamReader(json, "UTF-8"));
        while ((str=in.readLine()) != null) {
            buf.append(str);
        }
        in.close();
        return buf.toString();
    } catch (Exception e) {
        Log.e("er0r", e.toString());
    }
    return str;
}

从Solve.java类中调用该方法:

public static void permutateYellowEdges(){
    try {
        Rotations.rotateSequence(MainActivity.loadData("tables\\topLayer\\edgePerm.rt"), States.getYellowEdgeState());
    }catch(Exception e){
        e.printStackTrace();
    }
}

我得到的错误是" getAssets"下的红线。其中说"非静态方法getAssets不能从静态上下文中引用"。 我怎么能解决这个问题?

4 个答案:

答案 0 :(得分:2)

您需要使getAssets()静态,或使用静态引用调用它。目前,它被定义为非静态方法,您需要将方法设置为静态或非静态方法。否则,您需要为getAssets所在的类创建对象。

答案 1 :(得分:1)

非静态方法只能从创建的类实例中调用。静态方法不需要这个。因此,当您从静态调用非静态时,不会在实例上调用非静态方法(可能无法创建实例)。因此,您的代码不会被编译。

答案 2 :(得分:0)

您需要创建getAssets()方法所在类的对象。由于您的getAssets()方法未声明为Static,因此需要在调用之前创建它所包含的类的对象。如果它是静态方法,则可以在不启动对象的情况下调用它,但仍然可以参考它所属的类。例如:

public class classWhereGetAssetsIsIn {
    //More code here. Constructor is not necessary.
    typeMethodReturns getAssets() {
        //Code here.
    }
}

如果从静态上下文调用它,则在任何类甚至类本身内调用上面的方法(例如,public static void main(String [] args){})

classWhereGetAssetsIsIn instance = new classWhereGetAssetsIsIn();
InputStream json= instance.getAssets().open(inFile);

上述代码的工作原因是因为方法getAssets()是在从类的构造函数构造的对象中创建的。如果没有声明构造函数,则java编译器会创建一个默认的空构造函数,如上所示。请记住,如果你已经设置了自己的构造函数,则需要使用自己的构造函数构造一个对象,因为java编译器仅在类没有时才创建空对象(意思是即使你有一个带参数的构造函数,java编译器不会创建空的)。上述代码可以简写如下:

InputStream json= (new classWhereGetAssetsIsIn).getAssets().open(inFile);

通过将方法声明为静态,您将它绑定到类而不是它创建的对象,这意味着您可以通过编写来调用它:

InputStream json = classWhereGetAssetsIsIn.getAssets().open(inFile);

或者如果你在同一类getAssets()所在的public static void main(String [] args){}内部工作,你可以在原始代码显示时调用它:

InputStream json = getAssets().open(inFile);

为了使你的getAssets()函数变为静态,你只需在前面添加“static”关键字就像使用public static void main(String [] args){}:

public class classWhereGetAssetsIsIn {
    //More code here. Constructor is not necessary.
    static typeMethodReturns getAssets() {
        //Code here.
    }
}

答案 3 :(得分:0)

从上下文中调用它

InputStream jsonStream = context.getAssets().open(InFilename);

哪里

    static Context context;