0

我正在尝试读取其中包含 json 格式内容的 txt 文件,我正在使用异步任务从资产文件夹中读取文件,但得到空指针异常。下面是我的代码。

public class DownloadJSON extends AsyncTask<Void, Void, Void> {
    private MyDBAdapter dbHelper;

    String fileName = "json.txt";
     Context c;
     private static final String result = null;
    ArrayList<HashMap<String, String>> arraylist;

    @Override
    protected Void doInBackground(Void... params) {

         readFileFromAssets(fileName,c);
        return null;

}

 public static String readFileFromAssets(String fileName, Context c) {
     AssetManager assetManager = c.getAssets();
     InputStream is = null;
        try {
            is = assetManager.open(fileName);
            int size = is.available();
            byte[] buffer = new byte[size];
            is.read(buffer);
            is.close();
            String text = new String(buffer);
System.out.println("tex===========t"+ text);
            return text;

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
 }

下面是我的日志跟踪

09-24 10:53:25.430: E/AndroidRuntime(1714): Caused by: java.lang.NullPointerException
09-24 10:53:25.430: E/AndroidRuntime(1714):     at com.markupartist.android.actionbar.example.DownloadJSON.readFileFromAssets(DownloadJSON.java:75)
09-24 10:53:25.430: E/AndroidRuntime(1714):     at com.markupartist.android.actionbar.example.DownloadJSON.doInBackground(DownloadJSON.java:27)
09-24 10:53:25.430: E/AndroidRuntime(1714):     at com.markupartist.android.actionbar.example.DownloadJSON.doInBackground(DownloadJSON.java:1)
09-24 10:53:25.430: E/AndroidRuntime(1714):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
09-24 10:53:25.430: E/AndroidRuntime(1714):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
09-24 10:53:25.430: E/AndroidRuntime(1714):     ... 5 more

不知道我在哪里做错了。

4

5 回答 5

3

您没有初始化上下文对象,这就是它让您nullpointer exception像这样初始化它的原因。

Context c=getApplicationContext();
于 2013-09-24T05:26:19.393 回答
2

问题会出在这个问题上,AssetManager assetManager = c.getAssets();因为您没有通过适当的Context.

您正在声明Context但未在您的任何地方初始化,请AsynTask执行以下操作:

Context c;

c=activity.this;

否则,如果您在同一类中使用 asyntask,则直接将活动传递Context给您的函数。

readFileFromAssets(fileName,activity.this);

更新

创建构造DownloadJSON,获取上下文并使用相同的上下文,如下所示:

  public class DownloadJSON extends AsyncTask<Void, Void, Void> {
   Context ctx;
    public DownloadJSON(Context c) {
    ctx=c;

    }

并且同时调用DownloadJSONpass 是必要Context的。

于 2013-09-24T05:30:14.260 回答
1

你因为 Context 而得到 NullPointer,Context 传递的是 null,所以让 Context 像初始化

上下文 c; c=getApplicationContext() 或 c=活动名称.this

于 2013-09-24T05:42:19.257 回答
1

你还没有初始化你的上下文..所以首先让你的类构造函数......

ArrayList<HashMap<String, String>> arraylist;
Context ctx;

public DownloadJSON (Context c, ArrayList<HashMap<String, String>> list) {
    // TODO Auto-generated constructor stub
    this.ctx = c;
    this.arraylist= list;

}

最后使用这个 ctx 对象

readFileFromAssets(fileName,ctx);

谢谢....

于 2013-09-24T05:47:45.840 回答
0

每当你调用它asynctask时,请作为参数activity传递。这最终是上下文错误。context

所以请以正确的方式传递上下文。

我希望你明白。

于 2013-09-24T05:34:41.483 回答