1

Estoy haciendo un pequeño programa como tarea de instituto.

Al ejecutar el programa me da este error:

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

Os dejo el código para que podáis ver el fallo.

Programa principal:

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

}

Instituto1:

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

Curso:

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

}

Asignatura:

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

}

Alumno1:

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

Profesor:

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:

Instituto:

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

Profesor:

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


}

Alumno:

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

}

Clase Alumno:

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  
}

Gracias de antemano.

Pikoh
  • 17,305
  • 9
  • 38
  • 54

1 Answers1

2

El problema está en este while:

public void asignarAsignatura(String codigoCurso, String codigoAsignatura) {

        int i = 0;  
        int j = 0;

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

Sólo tienes un objeto curso dentro de un array de 10 posiciones (el resto son nulas), en la primera iteración funciona sin problemas pero en la segunda intenta hacer el getCodigoCurso() de un objeto nulo (curso[1]) y de ahí la NullPointerException

Tendrás que hacer un tratamiento previo para evitarla.

Edito tras tu comentario:

Lo que tendrías que hacer entonces es buscar primero si existe el código de asignatura y en qué posición del array está y lo mismo con el curso:

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

De todas formas, ya que tienes la clase Asignatura y la clase Curso creadas, lo mejor es que trabajes directamente con esos objetos y con listas. Sería algo así:

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

Evidentemente tendrías que cambiar más cosas pero fíjate cómo se simplifica el código.

Te animo a leer sobre listas porque se simplifica muchísimo el trabajo con estructuras de datos (https://docs.oracle.com/javase/7/docs/api/java/util/List.html)

Siguiendo con la implementación que te he comentado, te faltaría inicializar el array asignaturas en la clase Curso (si no te dará otra NullPointerException)

public void asignarAsignatura(Asignatura a){

        this.asignaturas[this.contAsignaturas] = a;

        this.contAsignaturas ++;

    }

Le he asignado un valor estático de 10 posiciones y funciona.

Asignatura[] asignaturas = new Asignatura[10];

Kiko_L
  • 6,455
  • 1
  • 11
  • 25
  • Lo que quiero conseguir con el while es conseguir en este caso es que el curso que yo introduzca sea igual a una que yo cree anteriormente. En conclusion yo quiero introducir un codigoCurso y un codigoAsignatura y que esa asignatura este dentro de ese Curso. – Carles Miranda Mar 18 '18 at 21:21