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、 如果你按照我的建议将你的活动
上下文
传递给全班同学,它会起作用的。让我知道它是如何工作的。请更正它。谢谢你的好心先生。非常欢迎!我将添加一个关于问题确切根源的编辑