Member 13511450 Ответов: 3

У меня проблема с массивом...


Привет ,
У меня есть проблема с массивом
Я читаю информацию из txt
эта информация:

4
5 3 4 3
Add_Course CPCS202 CPCS203 CPCS204 CPCS353
Add_ExamType Exam1 Exam2 FinalExam LabExams Assignments Quiz
Add_Student_For_ourse 0 Fatima Laila Maryam Khalida Zayneb
Add_Student_For_Course 1 Waleed Rashid Hassan
Add_Student_For_Course 2 Shahid Yusuf Rami Sohail
Add_Student_For_Course 3 Hina Reem Mona
Add_Marks
9 15 23	14 25 5
8 13 18	13 28 4
7 12 16	12 23 5
8 12 15	10 22 3
5 11 15 11 20 2
8 13 24 13 24 5
7 15 23 14 30 5
3 10 20 12 22 5
9 15 25 14 28 4
8 14 24 15 26 5
9 15 23 13 27 5
6 12 22 15 29 4
3 10 22 12 25 3
7 15 23 13 28 4
8 13 24 14 23 5



Проблема заключается в том, что при использовании 3-мерного массива
в этом коде : Array3D[i][j][k] = t.nextInt();
{ Exception in thread "main" java.lang.NullPointerException }

Что я уже пробовал:

public static void main(String[] args) throws FileNotFoundException {
        String[] FCourse, SCourse, TCourse, FourCourse;
        File f = new File("C:\\Users\\WCortex\\Desktop\\EA_1741415_P1_ExamGradingProgram_Main\\input.txt");
        Scanner t = new Scanner(f);
        if (!(f.exists())) {
            System.out.println("File Not found!");
            System.exit(0);
        }

        while (t.hasNextLine()) {
            String FLine = t.next();           //get 4
            int ToInt = Integer.parseInt(FLine);
            t.nextLine();
            String[] NumberOfStudents0 = new String[t.nextInt()]; //5
            String[] NumberOfStudents1 = new String[t.nextInt()]; //3
            String[] NumberOfStudents2 = new String[t.nextInt()]; //4
            String[] NumberOfStudents3 = new String[t.nextInt()]; //3
            int[]n={NumberOfStudents0.length,NumberOfStudents1.length,NumberOfStudents2.length,NumberOfStudents3.length};
            int[][][] Array3D = new int[ToInt][][];
            String[] Course = new String[ToInt]; //Number of Course "4"
            String[] ExamType = new String[6];

            String Line1 = t.next();   //Add_Course

            //Do Array
            System.out.println(Line1);
            do {

                if (Line1.equals("Add_Course")) {
                    for (int i = 0; i < ToInt; i++) {
                        Course[i] = t.next();
                        System.out.println(Course[i]);
                    }
                    t.nextLine();
                    Line1 = t.next();
                    System.out.println(Line1);
                } else if (Line1.equals("Add_ExamType")) {
                    for (int i = 0; i < 6; i++) {
                        ExamType[i] = t.next();
                        System.out.println(ExamType[i]);
                    }
                    Line1 = t.next();
                    System.out.println(Line1);
                } else if (Line1.equals("Add_Student_For_Course")) {
                    Line1 = t.next();
                    System.out.println(Line1);
                    if (Line1.equals("0")) {
                        for (int i = 0; i < NumberOfStudents0.length; i++) {
                            NumberOfStudents0[i] = t.next();
                            System.out.print(NumberOfStudents0[i]);
                        }
                        Line1 = t.next();
                    } else if (Line1.equals("1")) {
                        for (int i = 0; i < NumberOfStudents1.length; i++) {
                            NumberOfStudents1[i] = t.next();
                            System.out.print(NumberOfStudents1[i]);
                        }
                        Line1 = t.next();
                    } else if (Line1.equals("2")) {
                        for (int i = 0; i < NumberOfStudents2.length; i++) {
                            NumberOfStudents2[i] = t.next();
                            System.out.print(NumberOfStudents2[i]);
                        }
                        Line1 = t.next();
                    } else if (Line1.equals("3")) {
                        for (int i = 0; i < NumberOfStudents3.length; i++) {
                            NumberOfStudents3[i] = t.next();
                            System.out.print(NumberOfStudents3[i]);
                        }
                        Line1 = t.next();
                        System.out.println(Line1);
                    }

                } else if (Line1.equals("Add_Marks")) {
                    for (int i = 0; i < ToInt; i++) {
                        for (int j = 0; j <n[i]; j++) {

                            for (int k = 0; k < 6; k++) {
                                Array3D[i][j][k] = t.nextInt(); 
                                System.out.println(Array3D[i][j][k]);
                            }
                        }
                    }
                }

            } while (true);         
        }



    }

3 Ответов

Рейтинг:
24

OriginalGriff

При создании "3D массива":

int[][][] Array3D = new int[ToInt][][];
Вы не создаете массив с помощью ToInt кубические элементы: массив в Java - это массив массивов, массивов - и вы создали пространство только для "внешнего слоя" - "внутренние массивы" не имеют измерений, поэтому при попытке доступа к ним вы получаете нулевую ссылку.
Если то, что вы хотели, было кубом, то укажите пределы:
int[][][] Array3D = new int[ToInt][ToInt][ToInt];
И это должно начать работать.


Member 13511450

Это не куб.
как я могу это сделать ?
потому что это будет похоже
[ToInt][5][6]
[ToInt][3][6]
[ToInt][4][6]
[ToInt][3][6]
ToInt и 6 не меняются

Maciej Los

5ed!

Рейтинг:
19

W∴ Balboos, GHB

Альтернативным вариантом ответа OriginalGriff (1) является создание исходного 1-мерного массива.

Затем, когда вы добавляете элемент, вы объявляете сам этот элемент как массив.
Его элементы также могут быть массивами и т. д. Просто постройте их в соответствующем порядке - так вы создадите и заполните их в одном сложном шаге.

Это позволяет вам иметь смесь размеров строк в массиве. Если ты это сделаешь, тебе придется держать себя в руках!


Member 13511450

Хорошо, я могу использовать его без записи количества строк, потому что это будет изменение .

W∴ Balboos, GHB

Если какое-либо решение отвечает на ваш вопрос, пожалуйста, отметьте, что оно принято, чтобы закрыть вопрос

Maciej Los

5ed!

Рейтинг:
0

Maciej Los

Как разработчик Java вы должны знать, что вы можете создавать объекты и классы[^]. Вы можете управлять коллекцией пользовательских классов с помощью Список[^] интерфейс. Другими словами, вы должны работать с данными, а не с набором переменных или массивами строк/целых чисел и т. д.

Например Student класс может выглядеть так:

public class Student{
	private int stuId = 0;
	private String sName = "";
	
	public Student(int _id, String _Name){
		stuId = _id;
		sName = _Name;
	}

	public int getId(){
		return stuId;
	}
	
	public void setId(int _Id){
		stuId = _Id;
	}
	
	public String getName(){
		return sName;
	}
	
	public void setName(String _Name){
		sName = _Name;
	}
	
	@Override
	public String toString(){ 
		return "Student No: " + stuId + " - '" + sName + "'";
	}
}


Использование:
public static void main(String[] args) {

    List<Student> students = new ArrayList<Student>();
    for(int i=1; i<=10; i++)
    {
        Student stu = new Student(i, "Student" + i);
        students.add(stu);
    }

    for(Student stu: students){
        System.out.println(stu.toString());
    }
}


Приведенный выше код "производит" вывод:
Student No: 1 - 'Student1'
Student No: 2 - 'Student2'
Student No: 3 - 'Student3'
Student No: 4 - 'Student4'
Student No: 5 - 'Student5'
Student No: 6 - 'Student6'
Student No: 7 - 'Student7'
Student No: 8 - 'Student8'
Student No: 9 - 'Student9'
Student No: 10 - 'Student10'


Таким же образом вы должны создавать Exam и Mark класс.
Примечание: не забывайте создавать отношения между классами!