我试图创建一个方法,将文本从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不能从静态上下文中引用"。 我怎么能解决这个问题?
答案 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;