我已经四处寻找并且无法解决这个问题。
我的(第一个)问题是我在FileInputStream instream = context.getApplicationContext().openFileInput(textname);
方法的getLengthOfText();
上获得了NPE。我已经调试过,并且正确的文件名似乎传递给了这个方法。我已经坚持了几个星期,真的希望它能够工作(newb)。
此方法由另一个类调用。此外,文件存在于数据/数据中,其他一切都是应有的。请帮忙!! -Tricknology
/***** this class takes a text file and loads it into an array **/
public class loadArray {
Context context;
textWriter textwriter;
public loadArray (Context cxt) {
this.context = cxt;
textwriter = new textWriter (cxt);
context = cxt;
}
FileInputStream instream;
textWriter tw = new textWriter(context);
String[] choiceAry, dummyAry;
P p = new P(); // shared prefs helper
String Choice;
String comp = "notnull";
int addChoiceCount, length;
// Context context = this.getApplicationContext();
public void buildDummies(int length) {
// addChoiceCount = p.gisI("addChoiceCount");
choiceAry = new String[length];
p.pisI("length", length, context);
// dummyAry = new String[100];
}
public Integer getLengthOfText(String textname)
throws FileNotFoundException {// counts how many lines of text
// DataInputStream dis = new DataInputStream(openFileInput("file.dat"));
int length = 0;
instream = context.getApplicationContext().openFileInput(textname);
InputStreamReader inputreader = new InputStreamReader(instream);
BufferedReader buffreader = new BufferedReader(inputreader);
try {
// while (!comp.equals(null)){
while (buffreader.ready()) {
String temp = buffreader.readLine();
length++;
}
buffreader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return length;
}
public String[] laft(String textname) throws FileNotFoundException {
// loads a text file to an array...load array from text........
length = getLengthOfText(textname);
buildDummies(length);
try {
instream = context.getApplicationContext().openFileInput(textname);
InputStreamReader inputreader = new InputStreamReader(instream);
BufferedReader buffreader = new BufferedReader(inputreader);
// load array from text
for (int i = 0; i < (length); i++) {
try {
Choice = buffreader.readLine();
choiceAry[i] = Choice;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
buffreader.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return choiceAry;
}
public String getOrderName() {
// TODO Auto-generated method stub
return null;
}
}
感谢来自#android-dev
的利兹和台球,我找到了答案我正在做的是从另一个没有扩展活动的类调用loadArry ..所以它是活动&gt;调用&gt;不扩展活动的类&gt;调用&gt;不扩展活动的类。在某种程度上,上下文丢失了。我基本上从
开始在顶部应用了类似的行Context context;
textWriter textwriter;
public loadArray (Context cxt) {
this.context = cxt;
textwriter = new textWriter (cxt);
context = cxt;
希望将来能节省很多时间。
答案 0 :(得分:1)
在我看来,唯一的原因是你可能在你说得到它的行中获得NPE,因为上下文在某种程度上是NULL(openFileInput
不会抛出NPE)确保context
不是NULL。
答案 1 :(得分:1)
当上下文仍然为null时,您的textWriter实例正在实例化。在方法之外发生的任何定义都将在调用构造函数之前发生。
顺便说一句,类名应该以大写字母开头,而不是以动词开头。它可以帮助您避免错误,让其他人更容易理解。
答案 2 :(得分:1)
你在代码中让事情变得太复杂了。最后,复杂的代码=更难调试。
我一直将文本文件加载到数组中。
考虑在类java.lang.String中使用java.util.StringTokenizer类或String split()方法。
TenFour4提出了另一个好处。
这就是代码看起来的样子......
Context context;
textWriter textwriter;
public loadArray (Context cxt){
this.context = cxt;
textwriter = new textWriter (cxt);
}
<强> - UPDATE - 强>
一个常见错误是您尝试读取的文件未正确关闭,因此每当您尝试访问仍然打开的文件时,您都会收到NullPointerException
。
e.g。
PrintWriter pw = new PrintWriter (new FileWriter (fileName));
pw.println ("This is output data: " + data);
//new loadArray ().getLengthOfText (fileName); //ERROR Throws NPE
pw.close(); //Make Sure you Close Before trying to read the file again!
new loadArray ().getLengthOfText (fileName); //Works like a charm :)