Error de inicialización de matriz

Estoy haciendo prácticas de programación java desde un sitio web. Tengo que mostrar esta salida usando matrices.

Enter the number of students: 3
Enter the grade for student 1: 55
Enter the grade for student 2: 108
Invalid grade, try again...
Enter the grade for student 2: 56
Enter the grade for student 3: 57
The average is 56.0

Este es mi código fuente hasta ahora, está generando un error The local variable grades may not have been initialized. ¿Cómo recupero esto? Tengo que hacer este programa usando matrices.

package array;

import java.util.Scanner;

public class GradesAverage {

    public static void main(String[] args) {

        int numStudents = 0;
        int[] grades;

        Scanner in = new Scanner(System.in);

        System.out.print("Enter number of students : ");
        numStudents = Integer.parseInt(in.next());

          for (int i = 0; i < numStudents; i++) {
              System.out.print("Enter grade of student "+i+" :");
              grades[i] = Integer.parseInt(in.next());
        }

    }

}

preguntado el 28 de julio de 12 a las 15:07

5 Respuestas

Cuando escribes

int[] grades;

declaras una variable llamada grades, que puede contener un valor de tipo int[]. Sin embargo, antes de que pueda usarlo, también debe inicializarlo, por ejemplo, crear la estructura de datos real. Esto se hace así:

int[] grades = new int[numStudents];

Tenga en cuenta que necesita saber el tamaño de antemano cuando declara un array, por lo que tendrá que mover la creación de la matriz justo antes de la for lazo.

Respondido 28 Jul 12, 15:07

A todas las variables declaradas en los métodos se les debe asignar un valor antes de leerlas para evitar valores basura.

También en las matrices de Java hay objetos, eso significa que debe crear una instancia de matriz con new y asígnelo a calificaciones antes de que pueda almacenar algo en él.

 grades = new int[numStudents];

Respondido 28 Jul 12, 15:07

Una matriz no tiene una asignación de memoria constante, por lo que debe asignar memoria a la nueva matriz.

por ejemplo

int[] grades = new int [numStudents]

Esto, por supuesto, debe escribirse solo después de conocer el valor de numStudents

Respondido 28 Jul 12, 15:07

No hay mucho que agregar a lo que ya dijo Keppil, pero me gustaría agregar un poco de 'por qué'.

Verá, cuando se crea int[] grades, no es más que un 'puntero vacío', que apunta a una ubicación aleatoria en la memoria.

Al asignar el valor de retorno de 'new int[numGrades]', el valor del puntero apunta a la ubicación en la memoria que se ha asignado. Esta memoria tiene el tamaño exacto de 'tamaño de un número entero multiplicado por el número de calificaciones', y se puede acceder a ella de forma segura.

Si esta matriz tiene un tamaño demasiado pequeño (o no se dimensiona en absoluto), generalmente se activa una excepción de violación de memoria, porque está escribiendo memoria a la que no tiene acceso, lo que a menudo hace que su programa se bloquee u otro comportamiento indefinido.

Recuerde: las matrices son diferentes de las variables normales.

Así que sí, para hacerlo corto:

calificaciones = new int[numGrades]; es lo que buscas Justo debajo de la línea, donde está analizando el número de entrada de estudiantes.

Como consejo adicional: la entrada del usuario SIEMPRE es una fuente de error. Asegúrese de incluir el manejo de errores para la salida no válida. (Por ejemplo, si algún sabelotodo decide ingresar 'John Smith' en lugar de una calificación.

Respondido 28 Jul 12, 15:07

Tienes que inicializar la variable antes de su uso.

Consulte una de las versiones correctas de su código:

package array;

import java.util.Scanner;

public class GradesAverage {

    public static void main(String[] args) {

        int numStudents = 0;
        int[] grades;

        Scanner in = new Scanner(System.in);

        System.out.print("Enter number of students : ");
        numStudents = in.nextInt();

        // this line was added
        grades = new int[numStudents];

        for (int i = 0; i < numStudents; i++) {
              System.out.print("Enter grade of student "+i+" :");
              grades[i] = Integer.parseInt(in.next());
        }

        // closing used resources is a good practice
        in.close();
    }

}

Respondido 28 Jul 12, 16:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.