从文件读取-如何?

时间:2019-02-21 14:47:56

标签: java android file nullpointerexception

im是android中的新功能,我尝试了一个使用蓝牙进行扫描和控制的应用程序,如果我在文件中红色的行等于我找到的设备的名称,但是我不能这样做,因为使用readLine()生成错误:“试图在空对象上调用虚拟方法'java.lang.String java.io.BufferedReader.readLine()'” 而且我不知道该如何解决。

package com.pack.regele;

import android.widget.ArrayAdapter;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class readFromFile{
MainActivity ma = new MainActivity();

BufferedReader br;

{
    try {
        br = new BufferedReader(new FileReader("com/pack/regele/alunniScuola.csv"));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}

ArrayAdapter<String> nomi = null;

public readFromFile(ArrayAdapter <String> nomi){
    this.nomi = nomi;
}

public void controllaAlunnoDellaClasse() throws IOException {
    String line, classeCercare = null;
    for(int i = 0; i < 2; i++){
        line = br.readLine();
        String[] splitta = line.split(",");
        while(line != null){
            if(splitta[0].equals(nomi.getItem(i))){
                classeCercare = contaAlunniClasse(splitta[1]);
            }
        }
    }
    stampaClasse(classeCercare);
}

public String contaAlunniClasse(String classe){
    int[] contatoreClasse = new int[8];
    switch(classe){
        case "3A": contatoreClasse[0]++; break;
        case "3B": contatoreClasse[1]++; break;
        case "3C": contatoreClasse[2]++; break;
        case "4A": contatoreClasse[3]++; break;
        case "4B": contatoreClasse[4]++; break;
        case "4C": contatoreClasse[5]++; break;
        case "5A": contatoreClasse[6]++; break;
        case "5B": contatoreClasse[7]++; break;
    }
    int max = controllaClasseMax(contatoreClasse);
    return controllaLaClasse(max);
}

public int controllaClasseMax(int[] contatoreClassi){
    int max = contatoreClassi[0], classeMaggiore = 0;
    for(int i = 1; i < contatoreClassi.length; i++){
        if(contatoreClassi[i] > max){
            max = contatoreClassi[i];
            classeMaggiore = i;
        }
    }
    return classeMaggiore;
}

 public String controllaLaClasse(int max){
    switch(max){
        case 0: return "3A";
        case 1: return "3B";
        case 2: return "3C";
        case 3: return "4A";
        case 4: return "4B";
        case 5: return "4C";
        case 6: return "5A";
        case 7: return "5B";
    }
    return null;
 }

 public void stampaClasse(String classeStampare) throws IOException {
    String line = br.readLine();
    String[] arraySplit = line.split(",");
    while(line != null){
        if(arraySplit[1].equals(classeStampare)){
            nomi.add(line);
        }
    }
 }
}

这是我的课程,第32行向我生成错误。

2 个答案:

答案 0 :(得分:1)

让我们再次阅读错误消息:

"Attempt to invoke virtual method 'java.lang.String java.io.BufferedReader.readLine()' on a null object"

您试图在null对象上调用readLine()。您要在哪个对象上调用readLine()?我们可以在这里找到它:

line = br.readLine();

因此,我们发现br为空。为什么它为空?您正在初始化程序块中初始化br:

try {
        br = new BufferedReader(new FileReader("com/pack/regele/alunniScuola.csv"));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

似乎找不到“ com / pack / regele / alunniScuola.csv”。在这种情况下,将抛出FileNotFoundException,并且不会初始化br。因此它将为空。您正在捕获异常,因此程序在使用br时继续运行并在以后崩溃。

查看logcat。如果我是对的,则应该在日志中找到FileNotFoundException。

答案 1 :(得分:0)

添加

if (br != null) {
    line = br.ReadLine();
    String[] splitta = line.split(",");
}

首先检查br是否为空