2016-12-07 5 views
-4

Я действительно новичок в программировании, и я пытаюсь настроить инвентарь учащихся и проверять ввод, проверяя каждое поле.Исключительное исключение указателя в Java

Он содержит посещаемость в течение 10 дней, и мне нужно проверить каждое поле, в котором есть либо Да/Нет. И я назначаю их полям классов с использованием методов getter/setter. Поскольку Attendance представляет собой последовательность из 10 входов, я назначаю их как список и передавая их как параметр методу set и присваиваю их массиву Class.

Хотя список не пуст, присвоение его массиву бросает «исключение Null pointer» и неспособно выяснить почему.

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 о любом исключении вы не можете понять, это хорошая идея добавить stacktrace (который выводит как «Exception blah blah at xyz ... at abc .. . в def ... ") – Fildor

+0

@jhamon - здесь добавлен весь код. Надеюсь, это поможет – fjosep

ответ

1

Прежде всего, необходимо инициализировать attendence строка массива.

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)); 
} 

В противном случае вы не можете достичь значения из-за посещаемости, потому что это просто указатель указывает нуль. Если вы знакомы с языками программирования более низкого уровня, массивы - это указатели, и они должны показать начало выделенного пространства памяти. Говоря новую строку [n], вы выделяете пространство памяти n * sizeof (string). Поэтому, если вы говорите о посещаемости [1], вы достигнете местоположения & посещаемости + sizeof (строка).

Кстати, строка - это массив символов, поэтому вы на самом деле получаете указатель указателя. Я имею в виду sizeof (string) = 1 слово.

+0

Любое предложение, как его инициализировать в приведенном выше коде? Потому что когда я пытался инициализировать значения во время объявления, я получаю исключение ArrayOutOfBound. – fjosep

+0

Проблема решена. Добавлена ​​инициализация для массива строк, и теперь нет ошибки. частная пустота setAttendence (Список studentList) { \t \t \t \t attendence = новый String [] { "нет", "да", "да", "нет", "да", "да", «да «да», «нет», «да»}; \t \t \t \t \t int j = 1; \t \t \t \t \t \t \t \t \t для (String ATTLIST: studentList) { \t \t \t \t \t \t \t если ((ATTLIST = нуль) && (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

Смежные вопросы