2017-04-18 106 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. 
    } 
} 
相關問題