Android Try/Catch不在自定义类NPE中工作

Android Try/Catch不在自定义类NPE中工作,android,nullpointerexception,try-catch,Android,Nullpointerexception,Try Catch,相当简单。我的主要项目有一个很大的类,它变得“笨拙”。所以今天我决定尝试制作我自己的类,这样我就可以简化大类中的一些代码。 这是我的“小”类,用于数据存储。TRY/CATCH语句在大类中当自身浮动时起作用。但在小班里,它会抛出一个NPE。当我创建自己的类时,Try/Catch系统似乎不起作用。有什么想法吗 file_in=openFileInput(“数组_已保存”) 由Logcat调用 …这是一节课: package com.eai.thepicker; import java.io.Fil

相当简单。我的主要项目有一个很大的
类,它变得“笨拙”。所以今天我决定尝试制作我自己的
,这样我就可以简化大
类中的一些
代码
。 这是我的“小”
,用于
数据存储
TRY/CATCH
语句在大类中当
自身浮动时起作用。但在小班里,它会抛出一个NPE。当我创建自己的
类时,Try/Catch系统似乎不起作用。有什么想法吗

file_in=openFileInput(“数组_已保存”)

由Logcat调用

…这是一节课:

package com.eai.thepicker;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;    
import android.app.Activity;


public class DataHandler extends Activity {

    FileOutputStream file_out;
    FileInputStream file_in;
    ObjectOutputStream obj_out;
    ObjectInputStream obj_in;
    ArrayList<String> retrieved_data;

    public DataHandler(){
    }

    @SuppressWarnings("unchecked")
    public ArrayList<String> retrieveData(){

        try {   
            file_in = openFileInput("array_saved");
            obj_in = new ObjectInputStream(obj_in);
            if(obj_in.available() > 0){
            retrieved_data = (ArrayList<String>) obj_in.readObject();
            }
            else{
                retrieved_data = new ArrayList<String>();
               }

            obj_in.close();
            file_in.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        return retrieved_data;

    }

    public void saveData(ArrayList<String> data_out){
        try {
            file_out = openFileOutput("array_saved", 0);
            obj_out = new ObjectOutputStream(file_out);
            obj_out.writeObject(data_out);
            obj_out.close();
            file_out.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }   
    }


}
package com.eai.thepicker;
导入java.io.FileInputStream;
导入java.io.FileNotFoundException;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.io.ObjectInputStream;
导入java.io.ObjectOutputStream;
导入java.util.ArrayList;
导入android.app.Activity;
公共类DataHandler扩展活动{
文件输出流文件输出;
文件输入流文件\u in;
ObjectOutputStream对象输出;
目标输出流对象输入;
ArrayList检索到的数据;
公共数据处理程序(){
}
@抑制警告(“未选中”)
公共ArrayList retrieveData(){
试试{
file_in=openFileInput(“数组_已保存”);
obj_in=新对象输入流(obj_in);
如果(obj_in.available()>0){
在.readObject()中检索到的_数据=(ArrayList)obj_;
}
否则{
检索到的_data=new ArrayList();
}
obj_in.close();
文件_in.close();
}catch(filenotfounde异常){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}catch(classnotfounde异常){
e、 printStackTrace();
}
返回检索到的数据;
}
public void saveData(ArrayList data_out){
试一试{
file_out=openFileOutput(“数组_已保存”,0);
obj_out=新对象输出流(文件输出);
对象输出。写入对象(数据输出);
obj_out.close();
file_out.close();
}catch(filenotfounde异常){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}   
}
}

我认为问题在于您试图调用此方法

openFileInput()
不给它所需的
上下文
。我仍然认为您不需要
扩展活动
,但是通过删除
扩展活动
,使其成为一个常规类。在调用
活动
中需要时创建此类的实例,如

DataHandler data = DataHandler (this);  // give context
data.retrieveData();
类似这样的调用方法。然后在类中创建一个构造函数,如

ublic class DataHandler extends Activity {

FileOutputStream file_out;
FileInputStream file_in;
ObjectOutputStream obj_out;
ObjectInputStream obj_in;
ArrayList<String> retrieved_data;
Context mContext;   // add Context variable

public DataHandler(Context context){
mContext = context;   assign context
}
public类数据处理程序扩展活动{
文件输出流文件输出;
文件输入流文件\u in;
ObjectOutputStream对象输出;
目标输出流对象输入;
ArrayList检索到的数据;
Context mContext;//添加上下文变量
公共数据处理程序(上下文){
mContext=上下文;分配上下文
}
然后在你的方法中使用

 public ArrayList<String> retrieveData(){

    try {   
        file_in = mContext.openFileInput("array_saved");
        obj_in = new ObjectInputStream(obj_in);
        if(obj_in.available() > 0){
        retrieved_data = (ArrayList<String>) obj_in.readObject();
        }
        else{
            retrieved_data = new ArrayList<String>();
            }

        obj_in.close();
        file_in.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

    return retrieved_data;

}
public ArrayList retrieveData(){
试试{
file_in=mContext.openFileInput(“数组_已保存”);
obj_in=新对象输入流(obj_in);
如果(obj_in.available()>0){
在.readObject()中检索到的_数据=(ArrayList)obj_;
}
否则{
检索到的_data=new ArrayList();
}
obj_in.close();
文件_in.close();
}catch(filenotfounde异常){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}catch(classnotfounde异常){
e、 printStackTrace();
}
返回检索到的数据;
}
我相信这样做会有所帮助。
openFileInput()
方法需要一个
Context
,此时它是
null
,因此
NPE
。将
Context
传递给类将解决这个问题,因为它将具有当前的
活动上下文


发布堆栈跟踪,这样我们就可以看到其崩溃的位置,而不是猜测。此外,您正在扩展
活动
,但没有调用
onCreate()
。如果您没有
视图
,那么您可能不需要
扩展活动
,只需在需要时通过创建类的
实例来调用类方法。我已经扩展了活动,因为FileOutputStream/FileInputStream没有它就无法工作。请给我一分钟时间测试上下文。我们将继续e、 如果你按照我的建议将你的
活动
上下文
传递给全班同学,它会起作用的。让我知道它是如何工作的。请更正它。谢谢你的好心先生。非常欢迎!我将添加一个关于问题确切根源的编辑