从.txt文件加载数组? (机器人)

时间:2011-08-01 22:24:13

标签: android

我已经四处寻找并且无法解决这个问题。 我的(第一个)问题是我在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;

希望将来能节省很多时间。

3 个答案:

答案 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 :)