2016-12-07 22 views
-4

私はプログラミングに本当に新しいので、学生インベントリをセットアップし、各フィールドをチェックして入力を検証しようとしています。Javaのヌルポインタ例外

これは10日間の出席を含み、はい/いいえのいずれかの各フィールドを検証する必要があります。私はgetter/setterメソッドを使ってクラスフィールドに割り当てます。 Attendanceは10個の入力系列であるため、リストとして割り当てて、それらをsetメソッドのパラメータとして渡し、クラス配列に割り当てます。

リストは空ではありませんが、配列に割り当てると 'Nullポインタ例外'がスローされ、その理由がわかりません。

import java.util.*; 

パブリッククラスStudentdetail {

String studentName; 
String studentId; 
String classCode; 
String[] attendence;//={"no"," yes", "yes"," no", "yes"," yes", "yes", "yes"," no"," yes"}; 

String test1; 
String test2; 
String tutorial; 
String exams; 

public String getStudentName() { 
    return studentName; 
} 

public void setStudentName(String studentName) { 
    this.studentName = studentName; 
} 

public String getStudentId() { 
    return studentId; 
} 

public void setStudentId(String studentId) { 
    this.studentId = studentId; 
} 

public String getClassCode() { 
    return classCode; 
} 

public void setClassCode(String classCode) { 
    this.classCode = classCode; 
} 

public String[] getAttendence() { 

    return attendence; 
} 

private void setAttendence(List<String> studentList) { 

     int j=1; 


     for(String attList: studentList){ 

      if(attList != null){ 
       attendence[j]= attList; 
      } 
      j++; 

    } 
} 

public String getTest1() { 
    return test1; 
} 

public void setTest1(String test1) { 
    this.test1 = test1; 
} 

public String getTest2() { 
    return test2; 
} 

public void setTest2(String test2) { 
    this.test2 = test2; 
} 

public String getTutorial() { 
    return tutorial; 
} 

public void setTutorial(String tutorial) { 
    this.tutorial = tutorial; 
} 

public String getExams() { 
    return exams; 
} 

public void setExams(String exams) { 
    this.exams = exams; 
} 



public static void main(String[] args) { 

    String sampleInput = "S0032124, Tan ah cat, ICT310-FT02, no, yes, yes, no, yes, yes, yes, yes, no, yes, 43, 55, 12, 53"; 

    ArrayList<String> studentList = new ArrayList<String>(); 

    for (String s : sampleInput.split(",")) { 
     studentList.add(s); 
    } 
    Studentdetail newStudent = new Studentdetail(); 

    newStudent.setStudentId(studentList.get(0)); 

    newStudent.setStudentName(studentList.get(1)); 

    newStudent.setClassCode(studentList.get(2)); 

    newStudent.setAttendence(studentList.subList(3, 12)); 

    newStudent.setTest1(studentList.get(13)); 

    newStudent.setTest2(studentList.get(14)); 

    newStudent.setTutorial(studentList.get(15)); 

    newStudent.setExams(studentList.get(16)); 

    boolean value; 


    value = classCodeValidator(newStudent.getClassCode()); 

    value = stuAttValidator(newStudent.getAttendence()); 

    if (value == true) 
     System.out.println("Class code verified " 
       + newStudent.getClassCode()); 
    else 
     System.out.println("Class code invalid " 
       + newStudent.getClassCode().trim().substring(6,7)); 

} 


public boolean stuIdValidator(String stuId) { 
    if (stuId.length() == 8) { 
     if (stuId.substring(0, 1) == "S") 
      return true; 
    } 

    return false; 
} 

public static boolean classCodeValidator(String classCode) { 
    // ICT303-FT07 

    if (classCode.trim().length() == 11) 
     if (classCode.trim().substring(6,7).equals("-")) 
      if (classCode.trim().substring(1,7).length() == 6) 
       if (classCode.trim().substring(7, 11).length() == 4) 
        return true; 
    return false; 

} 

public static boolean stuAttValidator (String[] stuAtten){ 

    for(String attMarker: stuAtten){ 

     if(attMarker.equalsIgnoreCase("YES") || attMarker.equalsIgnoreCase("NO")) 
      return true; 

    } 

    return false; 
} 

}

+5

'出席 'は初期化されていません。デバッガを使用してこの種のバグを解決してください – jhamon

+0

一般的に、あなたが把握できない例外をSOに尋ねるときは、スタックトレースを追加することをお勧めします(例外は「xyz ... at abc .. 。def ... ") – Fildor

+0

@jhamon - ここにコード全体が追加されました。これが役に立ちますようお願いいたします – fjosep

答えて

1

まず、あなたの文字列配列のattendenceを初期化する必要があります。それだけでポインタがNULLを示しているので、

string[] attendence; 

private void setAttendence(List<String> studentList) { 

     int j=1; 

     for(String attList: studentList){ 

      if(attList != null){ 
       attendence[j]= attList; // getting null pointer exception 
      } 
      j++; 
    } 
} 
    public static void main(String[] args) { 

    String sampleInput = "S0032124, Tan ah cat, ICT310-FT02, no, yes, yes, no, yes, yes, yes, yes, no, yes, 43, 55, 12, 53"; 

    ArrayList<String> studentList = new ArrayList<String>(); 

    for (String s : sampleInput.split(",")) { 
     studentList.add(s); 
    } 
attendence = new string[36]; 
newStudent.setAttendence(studentList.subList(3, 12)); 
} 

そうしないと、attendenceから値に到達することはできません。 下位レベルのプログラミング言語がよくない場合、配列はポインタであり、割り当てられたメモリ空間の先頭を示す必要があります。新しいstring [n]と言って、n * sizeof(string)バイトのメモリ空間を割り当てます。だからあなたが出席[1]と言うなら、あなたは&出席+ sizeof(文字列)の場所に到達するでしょう。

By stringは文字配列なので、実際にはポインタのポインタを取得します。私はsizeof(string)= 1単語を意味します..

+0

上記のコードでどのように初期化するのですか?私が宣言時に値を初期化しようとすると、ArrayOutOfBound例外が発生するためです。 – fjosep

+0

問題が解決しました。文字列配列の初期化を追加しました。エラーはありません。 ます。private void setAttendence(一覧 studentList){ \t \t \t \t attendence =新しいString [] { "いいえ"、 "はい"、 "はい"、 "いいえ"、 "はい"、 "はい"、「はい"、"はい "、"いいえ "、"はい "}; \t \t \t \t \t int j = 1; (文字列ATTLIST:studentList)用\t \t \t \t \t \t \t \t \t { \t \t \t \t \t \t \t IF((ATTLIST = NULL)&&(attendence!= null)){ \t \t \t \t \t出席[j] = attList; \t \t \t \t} \t \t \t \t J ++; \t \t \t \t \t \t} – fjosep

関連する問題