【问题标题】:Non-static method getAssets can not be referenced from a static context (Java)(Android)不能从静态上下文中引用非静态方法 getAssets (Java)(Android)
【发布时间】:2017-04-18 20:23:11
【问题描述】:

我正在尝试创建一种方法,将 txtfile 中的文本转换为字符串。当我从它所在的同一个类中调用它时,该方法正在工作(该类是一个活动)。但是当我从另一个类(一个普通类)调用它时,它需要是静态的。而且我对静态了解不多,但是该方法在静态时不起作用。由于我需要从另一个类调用该方法,我要么需要该方法是非静态的,要么在它是静态时修复错误。方法如下:

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”。 我该如何解决这个问题?

【问题讨论】:

标签: java android static


【解决方案1】:

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

【讨论】:

  • 如何使 getAssets 静态化?
  • 可以发一下方法吗?
  • 您没有发布getAssets 方法。发布。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    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() 函数静态化,您只需像使用 public static void main(String[] args){} 一样在前面添加“static”关键字:

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

    【讨论】:

      【解决方案4】:

      从上下文中调用它

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

      在哪里

          static Context context;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-05
        • 2021-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多