0

estoy realizando un problema de una práctica en Java utilizando POO, la cual es la siguiente:

Un profesor desea saber el promedio de sus alumnos con respecto a 3 calificaciones durante el periodo. Como cuenta con varios grupos, antes de introducir las calificaciones, el sistema deberá solicitar el número de alumnos del grupo. Al momento de introducir las calificaciones se debe calcular el promedio de cada alumno. Al final se desea desplegar: a) Promedio de todo el grupo. b) El alumno de mayor promedio de cada grupo. c) El alumno de menor promedio de cada grupo. d) El alumno de mayor promedio de todos los grupos. e) El alumno de menor promedio de todos los grupos. f) Lista de cada grupo ordenada por apellido paterno. Considerar que el profesor puede capturar calificaciones de uno o más grupos. En la salida se debe desplegar: Nombre completo del Alumno, grado, grupo, las 3 calificaciones, el promedio y carrera a la que pertenece.

Obtengo esta excepción:

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "com.mycompany.practica7.Alumno.getGroup()" because "a[i]" is null at com.mycompany.practica7.Principal.main(Principal.java:64)

Para esto tengo creadas 2 clases. La clase: Alumno y la clase Principal(dónde está el main)

Adjunto el código de las clases:

Clase: Alumno


public class Alumno 
{
    private String nombre;
    private int grupo;
    private int calif1;
    private int calif2;
    private int calif3;
    private double promedio;
    private int grado;
    private String carrera;
    
    public Alumno()
    {
        nombre="";
        grupo=0;
        calif1=0;
        calif2=0;
        calif3=0;
        promedio=0.0f;
        grado=0;
        carrera="";
    }
    
    public void setNombre(String n)
    {
        nombre = n;
    }
    
    public String getNombre()
    {
        return nombre;
    }
    
    public void setGrupo(int g)
    {
        grupo = g;
    }
    
    public int getGroup()
    {
        return grupo;
    }
    
    public void setCalif1(int c1)
    {
        calif1 = c1;
    }
    
    public int getCalif1()
    {
        return calif1;
    }
    
    public void setCalif2(int c2)
    {
        calif2 = c2;
    }
    
    public int getCalif2()
    {
        return calif2;
    }
    
    public void setCalif3(int c3)
    {
        calif3 = c3;
    }
    
    public int getCalif3()
    {
        return calif3;
    }
    
    public void setProm(double prom)
    {
        promedio = prom;
    }
    
    public double getProm()
    {
        return promedio;
    }
    
    public void setGrado(int gr)
    {
        grado = gr;
    }
    
    public int getGrado()
    {
        return grado;
    }
    
    public void setCarrera(String career)
    {
        carrera = career;
    }
    
    public String getCarrera()
    {
        return carrera;
    }
}

Clase: Principal


package com.mycompany.practica7;

import java.util.Scanner;

public class Principal 
{
    public static void main(String[] args)
    {
        int sumTotAlumnos = 0;
        Scanner read = new Scanner(System.in);
        System.out.println("Ingrese el total de Grupos a evaluar: ");
        int cGrupos = read.nextInt();
        int countGrupos=1;
        
        int[] cantAlums = new int[cGrupos];
        int[] sumaPromGr = new int[cGrupos];
        
        for (int i = 0; i < cGrupos; i++) 
        {
            System.out.println("Ingrese Total de Alumnos del Grupo " + (i+1) + ": ");
            cantAlums[i] = read.nextInt();
            sumTotAlumnos += cantAlums[i];
        }
        
        Alumno a[] = new Alumno[sumTotAlumnos];
        
        String nombre;
        int grado = 0, calif1 = 0, calif2 = 0, calif3 = 0;
        double prom = 0.0f;
        for (int i = 0; i < cGrupos; i++)
        {
            for (int j = 0; j < cantAlums[i]; j++) 
            {
                a[j] = new Alumno();
                System.out.println("Ingrese el nombre del Alumno " + (j+1) + " del Grupo " + (i+1) + ": ");
                nombre = read.next();
                System.out.println("Ingrese el Grado del Alumno " + (j+1) + " del Grupo " + (i+1) + ": ");
                grado = read.nextInt();
                a[j].setNombre(nombre);
                a[j].setGrado(grado);
                a[j].setGrupo(i);
                a[j].setCalif1(j);
                System.out.println("Ingrese Calificación 1 de " + a[j].getNombre());
                calif1 = read.nextInt();
                System.out.println("Ingrese Calificación 2 de " + a[j].getNombre());
                calif2 = read.nextInt();
                System.out.println("Ingrese Calificación 3 de " + a[j].getNombre());
                calif3 = read.nextInt();
                prom = (calif1+calif2+calif3) / 3;
                sumaPromGr[i] += prom;
                
                // Setear Data
                
                a[j].setCalif1(calif1);
                a[j].setCalif2(calif2);
                a[j].setCalif3(calif3);
                a[j].setProm(prom);
            }
        }
        
        for (int i = 0; i < sumTotAlumnos; i++) 
        {
            if(a[i].getGroup() == countGrupos) //<- Esta linea contiene el error.
            {
                System.out.println(a[i].getNombre() + " Grupo: " + a[i].getGroup() + " Grado: " + a[i].getGrado() + " Promedio: " + a[i].getProm());
                countGrupos++;
                //Aún falta terminar el código, pero tengo ese problema antes de avanzar.
            }
        }
    }
}

De antemano, muchas gracias por la ayuda!

Alfabravo
  • 7,352
  • 5
  • 21
  • 31
  • ¿Responde esto a tu pregunta? [¿Cuál es la solución a todos los errores NullPointerException presentes, pasados y futuros?](https://es.stackoverflow.com/questions/42977/cu%c3%a1l-es-la-soluci%c3%b3n-a-todos-los-errores-nullpointerexception-presentes-pasados) – padaleiana Mar 02 '21 at 17:39

2 Answers2

0

En la clase Principal, prueba a imprimir el array entero antes de hacer el último bucle, el error te está diciendo que la posicion a[i], que si es la primera vuelta del bucle debe ser a[0] es nulo.

Imp0o
  • 3
  • 3
  • Hola! gracias por la ayuda, de esta forma se corrige el error, sin embargo lo que necesito es que el programa tome los datos primero (se ejecute el bucle completo) y al final me imprima los datos de cada alumno (objeto creado en el bucle), ¿Tal vez sea el problema de que cree el objeto dentro del bucle? – Joseph Gonzalez Mar 02 '21 at 17:48
  • Algo mal estás haciendo al rellenar el array, estás o saltandote alguna posición y dejandola null o no asignándole ningun valor a esa posicion. Lo siento mucho pero ahora mismo no te puedo mirar todo el código. Prueba a en el ultimo if añadir `&& a[i] != null`. – Imp0o Mar 02 '21 at 18:01
  • No tengo mucha experiencia manejando el Array de Objetos, coloqué el && a[i* != null sin embargo me continua arrojando el mismo error, con la diferencia de que si ingreso 2 datos(alumnos) me muestra el segundo, pero el primero no – Joseph Gonzalez Mar 02 '21 at 18:35
0

Estas sobre escribiendo los alumnos que insertas al inicio ya que en cada recorrido estas empezando con j = 0 así que cuando vas a agregar el nuevo grupo estas cambiando el objeto que ya tenias en a[0] y por esta razón no estas agregando todos los alumnos y al final del arreglo todo es null.

for (int i = 0; i < cGrupos; i++)
    {
        for (int j = 0; j < cantAlums[i]; j++) 
        {
            a[j] = new Alumno();

Edit

Podrías utilizar otra variable que mantenga el numero de estudiantes que has agregado. Por ejemplo:

int h = 0;
for (int i = 0; i < cGrupos; i++)
{
    for (int j = h; j < cantAlums[i] + h; j++)
    {
        a[j] = new Alumno();
        System.out.println("Ingrese el nombre del Alumno " + (j+1) + " del Grupo " + (i+1) + ": ");
        nombre = read.next();
        System.out.println("Ingrese el Grado del Alumno " + (j+1) + " del Grupo " + (i+1) + ": ");
        grado = read.nextInt();
        a[j].setNombre(nombre);
        a[j].setGrado(grado);
        a[j].setGrupo(i);
        a[j].setCalif1(j);
        System.out.println("Ingrese Calificación 1 de " + a[j].getNombre());
        calif1 = read.nextInt();
        System.out.println("Ingrese Calificación 2 de " + a[j].getNombre());
        calif2 = read.nextInt();
        System.out.println("Ingrese Calificación 3 de " + a[j].getNombre());
        calif3 = read.nextInt();
        prom = (calif1+calif2+calif3) / 3;
        sumaPromGr[i] += prom;
        
        // Setear Data
        
        a[j].setCalif1(calif1);
        a[j].setCalif2(calif2);
        a[j].setCalif3(calif3);
        a[j].setProm(prom);
    }
    h = cantAlums[i] + h;
}