非静态方法getAssets不能从静态上下文中引用(Java)(Android)
我试图让一个方法从txtfile中将文本转换为字符串。当我从它所在的同一个类调用该方法时,该方法正在工作(该类是一个活动)。但是当我从另一个类(普通类)调用它时,它需要是静态的。我对静态知之甚少,但该方法在静态时不工作。因为我需要从另一个类中调用方法,所以我需要该方法是非静态的,或者在静态时修复错误。下面是方法:非静态方法getAssets不能从静态上下文中引用(Java)(Android)
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不能从静态上下文中引用“。 我该如何解决这个问题?
你需要做getAssets()
静态,或使用静态引用调用它。目前它被定义为非静态方法,并且您需要让您的方法为静态或非静态。否则,你需要创建对象为getAssets
坐在。
非静态方法可以从类中创建的实例只能调用的类。静态方法不需要这个。所以当你从静态调用非静态的时候,非静态的方法在实例上不会被调用(实例可能不会被创建)。因此你的代码没有被编译。
您需要创建getAssets()方法所在的类的对象。由于您的getAssets()方法未声明为Static,因此它所在的类的对象需要在调用之前创建。如果它是一个静态方法,可以在不启动对象的情况下调用它,但仍然参考它属于哪个类。例如:
public class classWhereGetAssetsIsIn {
//More code here. Constructor is not necessary.
typeMethodReturns getAssets() {
//Code here.
}
}
调用任何类内的上述方法,甚至类本身如果从静态上下文调用它(FE公共静态无效的主要(字串[] args){})
classWhereGetAssetsIsIn instance = new classWhereGetAssetsIsIn();
InputStream json= instance.getAssets().open(inFile);
上述代码的工作原因是因为方法getAssets()是在从类的构造函数构造的对象中创建的。如果没有声明构造函数,那么java编译器将创建一个默认的空白符号,如上所示。请记住,如果您设置了自己的构造函数,则需要使用自己的构造函数构造一个对象,因为只有当类没有类时才由java编译器创建一个空对象(即使您有一个构造函数需要参数,java编译器不会创建空的)。上面的代码可以缺兵少将-LY写成如下:
InputStream json= (new classWhereGetAssetsIsIn).getAssets().open(inFile);
通过声明为静态要将它绑定到类,而不是它创建的对象的方法,这意味着你可以通过编写调用它:
InputStream json = classWhereGetAssetsIsIn.getAssets().open(inFile);
或者,如果你是在公共静态无效的主要(字串[] args)内的同一类getAssets工作{}()被安置在,你可以把它作为您的原始代码所示:
InputStream json = getAssets().open(inFile);
为了使您的getAssets()函数,静态,您只需通过添加“静态”的关键字在前面像你这样的公共静态无效的主要(字串[] args)做{}:
public class classWhereGetAssetsIsIn {
//More code here. Constructor is not necessary.
static typeMethodReturns getAssets() {
//Code here.
}
}
的可能的复制[什么是“非静态方法不能从静态上下文引用”背后的原因?](http://*.com/questions/290884/what-is-the-reason-behind-non-static-method-cannot-被静态引用) –
这个非常有趣的'我不会听线程'的某些重复:http://*.com/questions/43476217 – greenapps