Error executing my [duplicate] program

1

I'm doing a small program as an institute assignment.

When executing the program I get this error:

  

Exception in thread "main" java.lang.NullPointerException       at Instituto1.asignarAsignatura (Instituto1.java:103)       at Program.main (Program.java:26)

I leave the code so you can see the fault.

Main program:

public class Programa {
    public static void main(String[] args) {
        Instituto ins1 = new Instituto1("Instituto 1");
        //Crear Curso
        ins1.crearCurso("01", "DAM");

        //Crear Asignatura
        ins1.crearAsignatura("M2", "Base de Dades", 6, "10");
        ins1.asignarAsignatura("01", "M2"); 
    }

}

Institute1:

public class Instituto1 implements Instituto {
    //VARIABLES
        String nombre;
        private Profesor[] profesor;
        private Alumno[] alumno;
        private Curso[] curso;
        private Asignatura[] asignatura;

        private Profesor1[] profesor1;
        private Alumno1[] alumno1;

        private int nProfesor;
        private int nAlumnos;
        private int nCursos;
        private int nAsignaturas;

    //CONSTRUCTORES
        public Instituto1(String nombre){
            this.nombre = nombre;
            this.profesor = new Profesor[10]; 
            this.alumno = new Alumno[10];
            this.curso = new Curso[10];
            this.asignatura = new Asignatura[10];

            this.nProfesor = 0;
            this.nAlumnos = 0;
            this.nCursos = 0;
            this.nAsignaturas = 0;
        }

    //SETs

    //GETs

    //Operaciones
        public void crearProfesor(String nombre, String dni) {
            this.profesor[this.nProfesor] = new Profesor1(nombre,dni);

            this.nProfesor ++;

            System.out.println("Profesor Creado");
        }

        public void crearAlumno(String nombre, String dni) {
            this.alumno[this.nAlumnos] = new Alumno1(nombre,dni);

            this.nAlumnos ++;

            System.out.println("Alumno Creado");
        }

        public void crearCurso(String codigo, String nombre) {
            this.curso[this.nCursos] = new Curso(codigo, nombre);

            this.nCursos ++;

            System.out.println("Curso Creado");
        }

        public void crearAsignatura(String codigo, String nombre, int horasSemanales, String aula) {
            this.asignatura[this.nAsignaturas] = new Asignatura(codigo,nombre,horasSemanales, aula);

            this.nAsignaturas ++;

            System.out.println("Asignatura Creada");
        }

        public Profesor getProfesor(String dni){

            int i = 0;

            while(this.profesor[i].getDni().equalsIgnoreCase(dni)){ 
                i++;
            }

            System.out.print("Profesor Encontrado");

            return profesor[i];

        }

        public Alumno getAlumno(String dni) {

            int i = 0;

            while(this.alumno[i].getDni().equalsIgnoreCase(dni)){
                i++;
            }

            System.out.print("Alumno Encontrado");

            return alumno[i];

        }

        public void asignarAsignatura(String codigoCurso, String codigoAsignatura) {

            int i = 0;  
            int j = 0;

            while(this.curso[i].getCodigoCurso().equalsIgnoreCase(codigoCurso)){                
                i ++;
            }

            while(this.asignatura[j].getCodigoAsignatura().equalsIgnoreCase(codigoAsignatura)){
                j ++;
            }

            this.curso[i].asignarAsignatura(this.asignatura[j]);

            System.out.print("Asignatura Asignada");


        }

        public void asignarProfesor(String codigoAsignatura, String dni) {
            //int i = 0;
            //int j = 0;

            //while(this.asignatura[i].getCodigoAsignatura().equalsIgnoreCase(codigoAsignatura)) {
            //  i ++;
            //}

            //while(this.profesor1[j].getDni().equalsIgnoreCase(dni)) {
            //  j ++;
            //}

            //this.profesor1[j].asignarProfesor(this.asignatura[i]);

            //System.out.print("Profesor Asignado");

        }

        public void asignarAlumno(String codigoCurso, String dni) {
            //int i = 0;
            //int j = 0;

            //while(this.curso[i].getCodigoCurso().equalsIgnoreCase(codigoCurso)) {
            //  i++;
            //}

            //while(this.alumno[j].getDni().equalsIgnoreCase(dni)) {
            //  j++;
            //}

            //  this.alumno1[j].asignarAlumno(this.curso[i]);
        }

        public String informeAsignatura(String codigoAsignatura) {

            //int i = 0;

            //while(this.asignatura[i].getCodigoAsignatura().equalsIgnoreCase(codigoAsignatura)) {
            //  i++;
            //}


            // TODO Auto-generated method stub
            return null;            
        }

        public String verAula(String codigoAsignatura) {
            // TODO Auto-generated method stub
            return null;
        }

        public String verAulaAsignatura(String aula) {
            // TODO Auto-generated method stub
            return null;
        }

        public String verAlumnosCurso(String codigoCurso) {
            // TODO Auto-generated method stub
            return null;
        }

    //toString
        public String toString(){
            String s="";

            s+= "El nombre del Instituto es: "+this.nombre;

            return s;
        }
}

Course:

public class Curso {
    //VARIABLES
        String codigo;
        String nombre;

        Asignatura[] asignaturas;
        int contAsignaturas;

    //CONSTRUCTOR
        public Curso(String codigo, String nombre){
            this.codigo = codigo;
            this.nombre = nombre;

            this.contAsignaturas = 0;
        }

    //SETs
        public void setNombre(String nombre){
            this.nombre = nombre;
        }

        public void setCodigoCurso(String codigo){
            this.codigo = codigo;
        }   

    //GETs
        public String getNombreCurso(){
            return this.nombre;
        }

        public String getCodigoCurso(){
            return this.codigo;
        }

    //OPERACIONES

        public void asignarAsignatura(Asignatura a){

            this.asignaturas[this.contAsignaturas] = a;

            this.contAsignaturas ++;

        }

    //toString
        public String toString(){
            String s="";

            s+= "El nombre del CURSO es: "+this.nombre;
            s+= "y el codigo es: "+this.codigo;

            return s;
        }

}

Subject:

public class Asignatura {
    //VARIABLES
    String codigo; 
    String nombre;
    int horasSemanales; 
    String aula;

    //CONSTRUCTOR
    public Asignatura(String codigo, String nombre, int horasSemanales, String aula){
        this.codigo = codigo;
        this.nombre = nombre;
        this.horasSemanales = horasSemanales;
        this.aula = aula;
    }

    //GETs
    public String getNombreAsignatura(){
        return this.nombre;
    }

    public String getCodigoAsignatura(){
        return this.codigo;
    }

    public int getHorasSemanales(){
        return this.horasSemanales;
    }

    public String getAula(){
        return this.aula;
    }

    //SETs
    public void setNombre(String nombre){
        this.nombre = nombre;
    }

    public void setCodigoCurso(String codigo){
        this.codigo = codigo;
    }

    //OPERACIONES

    //toString
    public String toString(){
        String s="";

        s+= "El nombre del CURSO es: "+this.nombre;
        s+= "y el codigo es: "+this.codigo;

        return s;
    }

}

Student1:

public class Alumno1 extends Persona implements Alumno {
    //VARIABLES
    Asignatura[] asignaturas;
    int contAsignaturas3;
    Curso[] curso;
    int contCursos;

    //CONSTRUCTORES
        public Alumno1(String nombre, String dni){
            super(nombre,dni);
            this.contAsignaturas3 = 0;
            this.contCursos = 0;
        }

    //SETs
        public void setNombre(String nombre){
            this.nombre = nombre;
        }

        public void setDni(String dni){
            this.dni = dni;
        }

    //GETs

    //OPERACIONES
        public String verAsignaturas() {
            // TODO Auto-generated method stub
            return null;
        }

        public double verNotaAsignatura(String codigoAsignatura) {
            // TODO Auto-generated method stub
            return 0;
        }

        public String verInforme() {
            // TODO Auto-generated method stub
            return null;
        }

        public void asignarAlumno(Curso C) {

            this.curso[this.contCursos] = C;

            this.contCursos++;

        }

    //toString

        public String toString(){
            String s="";

            s+= "El nombre del Alumno es: "+this.nombre;
            s+= " y su DNI es "+this.dni;

            return s;
        }   
}

Professor:

public class Profesor1 extends Persona implements Profesor {
    //VARIABLES
    Asignatura[] asignaturas;
    int contAsignaturas2;
    //CONSTRUCTORES
        public Profesor1(String nombre, String dni){
            super(nombre,dni);

            this.contAsignaturas2 = 0;
        }

    //SETs
        public void setNombre(String nombre){
            this.nombre = nombre;
        }

        public void setDni(String dni){
            this.dni = dni;
        }

    //GETs

    //OPERACIONES
        public void ponerNota(String codigoAsignatura, String dni, double nota) {
            // TODO Auto-generated method stub

        }

        public String verAsignaturas() {
            // TODO Auto-generated method stub
            return null;
        }

        public int verHoras() {
            // TODO Auto-generated method stub
            return 0;
        }

        public void asignarProfesor(Asignatura B) {

            this.asignaturas[this.contAsignaturas2] = B;

            this.contAsignaturas2 ++;

        }


    //toString

        public String toString(){
            String s="";

            s+= "El nombre del Profesor es: "+this.nombre;
            s+= " y su DNI es "+this.dni;

            return s;
        }
}

Interface:

Institute:

public interface Instituto {
    /**
     * Crea un profesor para el instituto
     * @param nombre Nombre del profesor
     * @param dni DNI del profesor
     */
    public void crearProfesor(String nombre, String dni);

    /**
     * Crea un alumno para el instituto
     * @param nombre Nombre del alumno
     * @param dni DNI del alumno
     */
    public void crearAlumno(String nombre, String dni);

    /**
     * Crea un curso
     * @param codigo Codigo del curso
     * @param nombre Nombre del curso
     */
    public void crearCurso(String codigo, String nombre);

    /**
     * Crea una asignatura.
     * @param codigo Codigo de la asignatura.
     * @param nombre Nombre de la asignatura.
     * @param horasSemanales Numero de horas de la asignatura a la semana.
     * @param aula Nombre del aula donde se imparte la asignatura.
     */
    public void crearAsignatura(String codigo, String nombre, int horasSemanales, String aula);

    /**
     * Accede al profesor con el dni especifico
     * @param dni DNI del profesor a buscar
     * @return Objeto tipo Profesor
     */
    public Profesor getProfesor(String dni);

    /**
     * Accede al alumno con el dni especifico
     * @param dni DNI del alumno a buscar
     * @return Objeto tipo Alumno
     */
    public Alumno getAlumno(String dni);

    /**
     * Asigna una asignatura a un curso
     * @param codigoCurso Codigo del curso donde se asignar� la asignatura.
     * @param codigoAsignatura Codigo de la asignatura que se asignar� al curso.
     */
    public void asignarAsignatura(String codigoCurso, String codigoAsignatura);

    /**
     * Asigna un profesor a una asignatura.
     * @param codigoAsignatura Codigo de la asignatura a la que se asignar� el profesor.
     * @param dni DNI del profesor que se asignar� a la asignatura.
     */
    public void asignarProfesor(String codigoAsignatura, String dni);

    /**
     * Asigna un alumno a un curso.
     * @param codigoCurso Codigo del curso donde se asignar� el alumno.
     * @param dni DNI del alumno que se asignar� al curso.
     */
    public void asignarAlumno(String codigoCurso, String dni);

    /**
     * Pedimos una asignatura y nos da el informe con: 
     *      - Numero de estudiantes matriculados,
     *      - Numero de estudiantes evaluados (con nota introducida)
     *      - Numero y porcentaje de estudiantes aprobados (respecto a los evaluados)
     *      - Numero y porcentaje de estudiantes suspendidos (respecto a los evaluados)
     *      - Nota media de la asignatura (respecto a los evaluados)
     * @param codigoAsignatura Codigo de la asignatura a estudiar.
     * @return String con el informe de la asignatura.
     */
    public String informeAsignatura(String codigoAsignatura);

    /**
     * Muestra en que aula se da una asignatura
     * @param codigoAsignatura Codigo de la asignatura a estudiar.
     * @return String con el aula de la asignatura.
     */
    public String verAula(String codigoAsignatura);

    /**
     * Muestra que asignaturas se dan en un aula
     * @param aula Nombre del aula
     * @return String con la lista de asignaturas que se dan en ese aula.
     */
    public String verAulaAsignatura(String aula);

    /**
     * Muestra que alumnos est‡n matriculados en un curso
     * @param codigoCurso Codigo del curso a estudiar
     * @return String con la lista de alumnos que cursan ese curso.
     */
    public String verAlumnosCurso(String codigoCurso);
}

Professor:

public interface Profesor {
    /**
     * Coloca una nota a un alumnos en una asignatura que el profesor imparte
     * @param codigoAsignatura Codigo de la asignatura a evaluar.
     * @param dni DNI del alumno a evaluar.
     * @param nota Double con la nota del alumno en la asignatura.
     */
    public void ponerNota(String codigoAsignatura, String dni, double nota);
    /**
     * Muestra el nombre y el aula de las asignaturas asignadas a un profesor.
     * @return String con la lista de parejas de asignatura-aula
     */
    public String verAsignaturas();


    /**
     * Muestra el numero de horas que da el profesor a la semana. Es la suma de todas las asignaturas.
     * @return Numero total de horas semanales asignadas al profesor.
     */
    public int verHoras();

    /**
     * GET DNI del Profesor.
     * @return DNI del Profesor.
     */
    public String getDni();

    public String getNombre();


}

Student:

public interface Alumno {

    /**
     * Muestra el nombre de las asignaturas matriculadas por el alumno.
     * @return String con la lista de asignaturas.
     */
    public String verAsignaturas();

    /**
     * Muestra la nota de un alumno para una asignatura.
     * @param codigoAsignatura String con el codigo de la asignatura.
     * @return Nota asignada al alumno en la asignatura.
     */
    public double verNotaAsignatura(String codigoAsignatura);

    /**
     * Muestra la informacion de un alumno:
     *      - Asignaturas matriculadas
     *      - Nota de cada asignatura (NP - en las no evaluadas)
     *      - Si esta todo evaluado y aprobado : 
     *              - Nota media de todas las asignaturas
     *      - Si no esta todo aprobado o evaluado : 
     *              - Lista de asignaturas a repetir 
     * @return String con la informaci�n del alumno.
     */
    public String verInforme();

    /**
     * GET DNI del Alumno.
     * @return DNI del Alumno.
     */
    public String getDni();

    public String getNombre();

}

Student Class:

public class Persona {
    //VARIABLES
    String nombre;
    String dni;

    //CONSTRUCTORES
    public Persona(String nombre, String dni){
            this.nombre = nombre;
            this.dni = dni;
        }

    //SETs
    public void setNombre(String nombre){
        this.nombre = nombre;
    }

    public void setDni(String dni){
        this.dni = dni;
    }


    //GETs
    public String getNombre(){
        return this.nombre;
    }

    public String getDni(){
        return this.dni;
    }

    //Operaciones

    //toString  
}

Thanks in advance.

    
asked by Carles Miranda 18.03.2018 в 21:01
source

1 answer

2

The problem is in this while :

public void asignarAsignatura(String codigoCurso, String codigoAsignatura) {

        int i = 0;  
        int j = 0;

        while(this.curso[i].getCodigoCurso().equalsIgnoreCase(codigoCurso)){                
            i ++;
        }

You only have a curso object within an array of 10 positions (the rest are null), in the first iteration it works without problems but in the second one tries to make the getCodigoCurso() of a null object ( curso[1] ) and hence the NullPointerException

You will have to do a pre-treatment to avoid it.

I edit after your comment:

What you would have to do then is to first find out if the subject code exists and in what position of the array it is and the same with the course:

public void asignarAsignatura(String codigoCurso, String codigoAsignatura) {

        int idxAsignatura=-1;
        int idxCurso=-1;

    // Buscamos si existe la asignatura a asignar
        for (int i = 0; i < this.asignatura.length; i++) {
            if(this.asignatura[i]!=null)
            {
                if(this.asignatura[i].getCodigoAsignatura().equalsIgnoreCase(codigoAsignatura))
                {
                    idxAsignatura = i;
                }
            }
        }

        //Buscamos si existe el curso
        for (int j = 0; j < curso.length; j++) {
            if(this.curso[j]!=null)
            {
                if(this.curso[j].getCodigoCurso().equalsIgnoreCase(codigoCurso))
                {
                    idxCurso = j;
                }
            }
        }

        if(idxAsignatura!=-1 && idxCurso!=-1)
        {
            this.curso[idxCurso].asignarAsignatura(this.asignatura[idxAsignatura]);
        }


        System.out.print("Asignatura Asignada");        
    }

Anyway, since you have the class Asignatura and the class Curso created, the best thing is that you work directly with those objects and with lists. It would be something like this:

public void asignarAsignatura(Curso c, Asignatura a) {
//Si el curso c está contenido en la lista de cursos seguimos
        if(Arrays.asList(this.curso).contains(c))
        {
            //Si la asignatura también está contenida, la asignamos al curso
            if(Arrays.asList(this.asignatura).contains(a))
            {
                c.asignarAsignatura(a);
            }
        }
}

Obviously you should change more things but see how the code is simplified.

I encourage you to read about lists because the work with data structures is greatly simplified ( link )

Continuing with the implementation that I mentioned, you would need to initialize the array asignaturas in the class Curso (if it will not give you another NullPointerException)

public void asignarAsignatura(Asignatura a){

        this.asignaturas[this.contAsignaturas] = a;

        this.contAsignaturas ++;

    }

I have assigned a static value of 10 positions and it works.

Asignatura[] asignaturas = new Asignatura[10];

    
answered by 18.03.2018 / 22:17
source