2017-04-18 105 views
0

我试图让一个方法从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不能从静态上下文中引用“。 我该如何解决这个问题?

+0

的可能的复制[什么是“非静态方法不能从静态上下文引用”背后的原因?](http://stackoverflow.com/questions/290884/what-is-the-reason-behind-non-static-method-cannot-被静态引用) –

+0

这个非常有趣的'我不会听线程'的某些重复:http://stackoverflow.com/questions/43476217 – greenapps

回答

1

你需要做getAssets()静态,或使用静态引用调用它。目前它被定义为非静态方法,并且您需要让您的方法为静态或非静态。否则,你需要创建对象为getAssets坐在。

+0

如何使getAssets静态? – John

+0

你可以发布该方法吗? – BlackHatSamurai

+0

已在帖子中完成 – John

1

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

0

您需要创建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. 
    } 
} 
相关问题