【问题标题】:Android - openFileInput() NullPointerException [duplicate]Android - openFileInput() NullPointerException [重复]
【发布时间】:2019-07-22 17:23:38
【问题描述】:

我正在尝试在我的 android 应用程序中将代码生成为字符串并将其保存到文本文件中。当您按下共享按钮时,应从文本文件中读取代码并将其复制到剪贴板。

我想我不了解有关活动/上下文的内容。 当然,我阅读了有关它的文档,但我无法弄清楚问题所在。希望大家能帮帮我!

文件系统.java

package com.niclasjaksch.shoppinglist;

import android.content.Context;

import androidx.appcompat.app.AppCompatActivity;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

class FileSystem extends AppCompatActivity {

    static String filename = "shoppinglist_code.txt";

    void Create() {
        try {
            FileOutputStream fOut = openFileOutput(filename, Context.MODE_PRIVATE);
            String str = Utility.randomString(10);
            fOut.write(str.getBytes());
            fOut.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    String Read() {
        String result = "";
        try {
            FileInputStream fin = openFileInput(filename);
            int c;
            while( (c = fin.read()) != -1){
                result += c;
            }
            fin.close();
        } catch (Exception e) {
            System.out.println("An error occurred.");
            e.printStackTrace();
        }
        return result;
    }
    void Clear() {
        try {
            File dir = getFilesDir();
            File file = new File(dir, filename);
            file.delete();
        } catch (Exception e) {
            System.out.println("An error occurred.");
            e.printStackTrace();
        }
    }

}

Share.java

package com.niclasjaksch.shoppinglist;

import android.content.ClipData;

import androidx.appcompat.app.AppCompatActivity;

class Share extends AppCompatActivity {

    android.content.ClipboardManager clipboardManager = null;
    FileSystem fs = new FileSystem();

    void Share() {
        String code = fs.Read();
        if(code == "" || code == null) {
            fs.Create();
            code = fs.Read();
        }
        ClipData clipData = ClipData.newPlainText("Source Text", code);
        clipboardManager.setPrimaryClip(clipData);
    }
}

MainActivity.java

    ...

    Share share = new Share();

    ...

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.item_share:
                share.Share();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

在这一行中得到一个 NullPointerException:

FileOutputStream fOut = openFileOutput(filename, Context.MODE_PRIVATE);

【问题讨论】:

  • 请也分享一下logcat,以便我们了解哪个变量被赋值为null。

标签: java android io nullpointerexception


【解决方案1】:

仅为实际 UI 工作创建 AppCompatActivity 的子类,您将使用 startActivity() 或 startActivityForResult() 启动该活动。

将这些方法移到真实的活动中,例如MainActivity,并去掉Share 和FileSystem 类。

【讨论】:

    【解决方案2】:

    首先,您不应该将AppCompatActivity 扩展为FileSystem 和Share。

    正在发生的事情是 openFileOutput 将 FileSystem 对象 (this) 作为其上下文。实际上,它不会算作单独的活动。

    您可以按照 CommonWare 的建议进行操作,删除 FileSystem 和 Share 类,并将它们的功能移至 MainActivity。或者您可以从MainActivity 显式传递context。

    【讨论】:

      猜你喜欢
      • 2017-04-26
      • 1970-01-01
      • 1970-01-01
      • 2016-01-22
      • 2015-07-02
      • 2016-09-03
      • 2014-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多