Java - Java.lang.NullPointerException: Cannot read field "tipo" because "m" is null

 
Vista:

Java.lang.NullPointerException: Cannot read field "tipo" because "m" is null

Publicado por Mónica (3 intervenciones) el 24/02/2024 19:37:16
Buenas tardes:

Estoy escribiendo un método que me calcule el saldo de una cuenta. Después de muchas vueltas, el método calculaSaldo() ya no me da problemas de compilación, pero al ejecutarlo sale el siguiente mensaje:

Exception in thread "main" java.lang.NullPointerException: Cannot read field "tipo" because "m" is null

Por favor, ¿puede alguien decirme por qué?.
Gracias.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// Vector que garda os datos do programa
    Movemento[] movementos = new Movemento[MAX_MOVEMENTOS];
// Movementos anotados no vector
    int numMovementos = 0;
 
// Bucle principal da aplicacion
    void bucleApp() {
        Opcion opcion;
 
        do {
            mostraListaOpcions();
            opcion = solicitaOpcion();
 
             ...
                case SALDO ->
                    calculaSaldo();
 
            }
        } while (opcion != Opcion.SAIR);
    }
 
...
        }
    }
// Solicitar ao usuario a opcion que quere executar
 
    Opcion solicitaOpcion() {
        Scanner scanner = new Scanner(System.in);
        int opcion;
 
        System.out.print("\nIntroduce o numero de opcion a executar: ");
        opcion = scanner.nextInt();
 
        return Opcion.values()[opcion];
    }
// Anotar un novo movemento
 
    void anotaMovemento(TipoMovemento tipo) {
        Scanner scanner = new Scanner(System.in);
 
       ...
    }
// Mostrar a lista de movementos:
 
    void listaMovementos() {
        System.out.println();
        for (var indice = 0; indice < numMovementos; indice++) {
            System.out.println(movementos[indice]);
        }
        System.out.println();
    }
    // Calcular o saldo
    void calculaSaldo() {
        BigDecimal saldo;
        saldo = new BigDecimal(0);
 
        for (Movemento m: movementos) {
            if (m.tipo == TipoMovemento.ABONO) {
                saldo = saldo.add(m.importe);
                continue;
            } else {
                saldo = saldo.subtract(m.importe);
            }
            System.out.println(saldo);
        }
    }
 
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alfil
Val: 17
Ha aumentado 1 puesto en Java (en relación al último mes)
Gráfica de Java

Java.lang.NullPointerException: Cannot read field "tipo" because "m" is null

Publicado por Alfil (12 intervenciones) el 25/02/2024 08:50:30
Prueba a cambiar la línea 58 por:

1
if (m.tipo.equals(TipoMovemento.ABONO)) {

Con el código que has puesto poco más puedo decirte, siempre es preferible poner una parte de código (aunque sea preparada a tal efecto) que se pueda ejecutar. Por ejemplo, desconocemos los atributos y métodos de Movemento.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Java.lang.NullPointerException: Cannot read field "tipo" because "m" is null

Publicado por Mónica (3 intervenciones) el 25/02/2024 17:44:44
Buens tardes Alfil y gracias por tu interés. La clase Movemento está definida de la siguiente forma:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Datos do movemento
    final class Movemento {
 
        Date dataRexistro;
        TipoMovemento tipo;
        String concepto;
        BigDecimal importe;
 
        @Override
        public String toString() {
            return tipo.name() + " o " + dataRexistro
                    + " por " + importe + " euros. '" + concepto + "'";
        }
    }
    final static int MAX_MOVEMENTOS = 1024;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Billy Joel
Val: 2.665
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Java.lang.NullPointerException: Cannot read field "tipo" because "m" is null

Publicado por Billy Joel (876 intervenciones) el 25/02/2024 18:21:16
Lo que puedo ver es que defines el arreglo de movementos así
1
Movemento[] movementos = new Movemento[MAX_MOVEMENTOS];

Pero los objetos dentro del arreglo no están inicializados. Cuando haces el foreach en el método calculaSaldo falla porque los primeros objetos tal vez estén inicializados pero los finales no estén inicializados. Para corregir el problema puedes validar si el objeto es distinto de null antes de interactuar con él.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void calculaSaldo() {
    BigDecimal saldo;
    saldo = new BigDecimal(0);
    for (Movemento m : movementos) {
        if (m == null) {
            break;
        } else {
            if (m.tipo == TipoMovemento.ABONO) {
                saldo = saldo.add(m.importe);
                continue;
            } else {
                saldo = saldo.subtract(m.importe);
            }
            System.out.println(saldo);
        }
    }
}

El break sirve para salir de bucles.

Saludos,
Billy Joel
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Java.lang.NullPointerException: Cannot read field "tipo" because "m" is null

Publicado por Mónica (3 intervenciones) el 25/02/2024 18:50:50
Muchísimas gracias. Necesitaba una aclaración de los conceptos. Estoy empezando y todavía me supera un poco todo esto de los objetos, la inicialización...

Ahora va perfecto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar