2016-04-09 21 views
-1

///////////////////////////////////////////// ///////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// ////////////////////アセットからテキストファイルを読み取ることができません(Android Studio、JAVA)

答えはヘンリーの言葉です。 アクティビティではないクラスからアセットにアクセスすることは不可能です。 メインアクティビティからパラメータとしてAssetManagerオブジェクトを渡した後、それが機能し、非アクティビティクラスメソッドがアセットを読み取ることができます。私の場合は :

AssetManager am = getAssets(); 
tc.ReadFile2(am); 

////////////////////////////////////// ///////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// ///////////////////////

アセットディレクトリから.txtを読み込む際に問題があります。私はほとんどすべてを試み、まだ結果は常に同じです:

I/System.out: java.lang.NullPointerException 

これは、プロジェクトのディレクトリツリーをどのように見えるかです: directory tree

私はまた、資産の一覧を表示しようとしましたが、結果は上記と同じです。 ここに私のクラスの現在のコードは次のとおりです。

import java.io.*; 
import java.lang.*; 

import android.content.res.AssetManager; 
import android.support.v7.app.AppCompatActivity; 

public class TextChange extends AppCompatActivity { 
public TextChange(){} 

protected String ReadFile() throws IOException{ 
    BufferedReader reader = null; 
    reader = new BufferedReader(new InputStreamReader(context.getAssets().open("sampleText.txt"))); 
    String text = ""; 
    while (reader.readLine() != null){ 
     text = reader.readLine(); 
    } 
    System.out.println(text); 
    return text; 
} 

protected String ReadFile2() throws IOException{ 
    StringBuilder buf = new StringBuilder(); 
    InputStream input = getAssets().open("sampleText2.txt"); 
    BufferedReader in = new BufferedReader(new InputStreamReader(input, "UTF-8")); 
    String str; 

    while ((str=in.readLine()) != null) { 
     buf.append(str); 
    } 

    in.close(); 

    return buf.toString(); 
} 

public String[] ListAssets() throws IOException{ 
    AssetManager am = getAssets(); 
    String[] files = am.list(""); 
    for (String s : files) { 
     System.out.println(s); 
    } 
    return files; 
} 
} 

誰が間違っているとどのようにこの問題を修正するために何を教えてもらえますか? 助けを歓迎します!

のprintStackTrace:

W/System.err: java.lang.NullPointerException 
W/System.err:  at android.content.ContextWrapper.getAssets(ContextWrapper.java:83) 
W/System.err:  at jb.jbench.TextChange.ReadFile2(TextChange.java:28) 
W/System.err:  at jb.jbench.MainActivity$3.onClick(MainActivity.java:43) 
W/System.err:  at android.view.View.performClick(View.java:4438) 
W/System.err:  at android.view.View$PerformClick.run(View.java:18422) 
W/System.err:  at android.os.Handler.handleCallback(Handler.java:733) 
W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:95) 
W/System.err:  at android.os.Looper.loop(Looper.java:136) 
W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:5001) 
W/System.err:  at java.lang.reflect.Method.invokeNative(Native Method) 
W/System.err:  at java.lang.reflect.Method.invoke(Method.java:515) 
W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
W/System.err:  at dalvik.system.NativeStart.main(Native Method) 
+1

NullPointerExceptionはどの行にありますか?完全なStackTraceを投稿できますか? –

+0

完全例外メッセージは、Null Pointer Exceptionをスローしている特定の行番号を示します。そのエラーメッセージでコードのどの行が示されているかを教えていただけたら、おそらくあなたを助けることができます。 –

+2

このクラスは、あなたが 'onCreate()'メソッドを持たないため、ソースによって参照される 'context'フィールドを持たないので、アクティビティの無効な実装と思われます。 – CommonsWare

答えて

0

あなたはActivityクラスを自分でインスタンス化することはできません。常にシステムにそれをさせてください。アクティビティはIntentを使用して開始することができます。それ以外の場合、重要なフィールドは適切に初期化されません。

別のクラスに機能を追加する場合は、Activityを拡張して、必要なコンテキストをパラメータとして渡しません。

+0

しかし、私は新しい活動を始めません。主なアクティビティで行うのは、メソッドを呼び出してアセットを読み込むことだけです。 – definitelyNotLazy

+0

このメソッドは 'Activity 'が初期化されていないために動作しない' getAssets'を呼び出します。 – Henry

+0

したがって、classがアクティビティではなく、機能クラスだけが何らかの作業を行っている場合、それはアセットにアクセスできません。 – definitelyNotLazy

関連する問題