String.Split(“,”)访问第3项时返回nullpointer异常

时间:2014-02-03 19:19:50

标签: java android string split filereader

我的代码:

public ArrayList<People_Attendance> attendance_reader() {
    ArrayList<People_Attendance> attendance_list = new ArrayList<People_Attendance>();
    String file_string = "";
    try {
        InputStream filestream = openFileInput("Attendance_File");
        if (filestream != null) {
            InputStreamReader inputStreamReader = new InputStreamReader(filestream);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String receiveString;
            StringBuilder stringBuilder = new StringBuilder();

            while ( (receiveString = bufferedReader.readLine()) != null ) {
                stringBuilder.append(receiveString);
            }
            file_string = stringBuilder.toString();
            String parse_array[] = file_string.split(";");///splits into individual People_Attendance items.
            String item_name; String item_number; String item_status; ///declares all the item strings

            for(String person_item : parse_array) {
                String item_parse_array[] = person_item.split(",");
                item_name = item_parse_array[0];
                item_number = item_parse_array[1];
                item_status = item_parse_array[2];

                attendance_list.add(new People_Attendance(item_name, item_number, item_status));
                ///above is an example of an initialization method, custom inside of People_Attendance class.

            }
        }   

在这一行:

People_Attendance item = new People_Attendance(item_name, item_number, item_status);

这种初始化是怎么回事?它给出了一个NullPointerException,所以我的一个字符串可能是null? 我已经调试过,发现错误就在这里。我还发现我的读者读得正确,因为我插入了调试行,并从中获取了文本。我倾向于认为我在使用String.Split()做错了 经过更多调试后,我发现分裂后得到两个字符串 - 名称和状态,但由于某种原因没有数字......非常困惑。我的调试技术:

Log.d("DEBUG", person_item);

String item_name = item_parse_array[0];                     
Log.d("DEBUG", item_name);
String item_number = item_parse_array[1];
Log.d("DEBUG", item_number);
String item_status = item_parse_array[2];
Log.d("DEBUG", item_status);

因此我肯定会得到这个号码吗?

3 个答案:

答案 0 :(得分:1)

我尝试了您发布的代码并且工作正常。只有它可能出错的地方是从文件中读取。请在file_string = stringBuilder.toString();行添加一个断点,并检查您是否获得了正确的价值。

class SplitFunction{
    public static void main(String args[]) throws Exception{

      String file_string = "";
      file_string = "Dan Stedman,07895 678909,INVITED;Dan Stedman,07895 678909,INVITED;Dan Stedman,07895 678909,INVITED;";
      String parse_array[] = file_string.split(";");///splits into individual People_Attendance items.
      String item_name; String item_number; String item_status; ///declares all the item strings

      for(String person_item : parse_array){
        String item_parse_array[] = person_item.split(",");
        item_name = item_parse_array[0];
        item_number = item_parse_array[1];
        item_status = item_parse_array[2];
        System.out.println(item_status);
      }
    }
  }  

答案 1 :(得分:1)

readLine返回的字符串可能包含一些空格

parse_array中的第4个元素中没有“,”(只是“”),所以person_item.split(“,”);返回一个空数组。

您的行号必须未对齐,因为它应该在item_name = item_parse_array[0]上崩溃。 (如果[0]和[1]存在但[2]失败,那将是一个超出范围的例外。)

答案 2 :(得分:0)

People_Attendance item = new People_Attendance(item_name, item_number, item_status);
     

这种初始化是怎么回事?它给出了一个NullPointerException,因此可能我的一个字符串是null ??

仅当People_Attendance consructor NPE。

时,此行才会为NPE

如果注释足够正确,构造函数看起来像这样

People_Attendance(String name, String number, String status) {
    this.people_details.name = name;
    this.people_details.number = number;
    this.attendance_status = status;
}

如果people_detailsnull,则仅限NPE。与字符串拆分或null String引用无关,只是在使用前初始化成员变量。