Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法从静态上下文(Java)(Android)引用非静态方法getAssets_Java_Android_Static - Fatal编程技术网

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

无法从静态上下文(Java)(Android)引用非静态方法getAssets,java,android,static,Java,Android,Static,我试图创建一个方法,将文本从TXT文件转换成字符串。当我从它所在的同一个类(该类是一个活动)调用它时,该方法正在工作。但是当我从另一个类(普通类)调用它时,它需要是静态的。我对静态不太了解,但是当它是静态的时候,这个方法就不起作用了。因为我需要从另一个类调用该方法,所以我要么需要该方法是非静态的,要么在它是静态的时候修复错误。方法如下: public static String loadData(String inFile) { String str = ""; try{

我试图创建一个方法,将文本从TXT文件转换成字符串。当我从它所在的同一个类(该类是一个活动)调用它时,该方法正在工作。但是当我从另一个类(普通类)调用它时,它需要是静态的。我对静态不太了解,但是当它是静态的时候,这个方法就不起作用了。因为我需要从另一个类调用该方法,所以我要么需要该方法是非静态的,要么在它是静态的时候修复错误。方法如下:

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
所在的类创建对象

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

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

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

public class classWhereGetAssetsIsIn {
    //More code here. Constructor is not necessary.
    typeMethodReturns getAssets() {
        //Code here.
    }
}
在任何类内调用上述方法,甚至在从静态上下文调用该类时调用该类本身(例如,publicstaticvoidmain(String[]args){})

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

InputStream json= (new classWhereGetAssetsIsIn).getAssets().open(inFile);
通过将方法声明为静态,您将其绑定到类而不是它创建的对象,这意味着您可以通过编写以下命令来调用它:

InputStream json = classWhereGetAssetsIsIn.getAssets().open(inFile);
或者,如果您在同一类getAssets()的公共静态void main(String[]args){}中工作,则可以按原始代码所示调用它:

InputStream json = getAssets().open(inFile);
为了使getAssets()函数成为静态函数,只需像处理publicstaticvoidmain(String[]args){}一样在前面添加“static”关键字:


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

public class classWhereGetAssetsIsIn {
    //More code here. Constructor is not necessary.
    typeMethodReturns getAssets() {
        //Code here.
    }
}
在任何类内调用上述方法,甚至在从静态上下文调用该类时调用该类本身(例如,publicstaticvoidmain(String[]args){})

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

InputStream json= (new classWhereGetAssetsIsIn).getAssets().open(inFile);
通过将方法声明为静态,您将其绑定到类而不是它创建的对象,这意味着您可以通过编写以下命令来调用它:

InputStream json = classWhereGetAssetsIsIn.getAssets().open(inFile);
或者,如果您在同一类getAssets()的公共静态void main(String[]args){}中工作,则可以按原始代码所示调用它:

InputStream json = getAssets().open(inFile);
为了使getAssets()函数成为静态函数,只需像处理publicstaticvoidmain(String[]args){}一样在前面添加“static”关键字:


从上下文中调用它

InputStream jsonStream = context.getAssets().open(InFilename);
在哪里


从上下文中调用它

InputStream jsonStream = context.getAssets().open(InFilename);
在哪里


可能重复此非常有趣的“我不想听线程”的某些副本:可能重复此非常有趣的“我不想听线程”的某些副本:如何使getAssets静态?您可以发布此方法吗?您没有发布
getAssets
方法。发布。我如何使getAssets静态?您可以发布该方法吗?您没有发布
getAssets
方法。把它贴出来。