Почему я получаю NullPointerException с arrays?

У меня есть этот код, но меня отпускает один NullPointerException и я не знаю, каковой может быть неудача:

import java.util.Scanner;
public class Main {
    public static Scanner sc=new Scanner(System.in);
    public static String[] mensaje;
    public static String men;

    public static void main(String[] args){
        System.out.println("Eliga una opcion [1-3]");
        System.out.println("Codificar mensaje");
        System.out.println("Decodificar mensaje");
        System.out.println("Salir");
        int opcion = sc.nextInt();
        if(opcion == 1){
            sc.nextLine(); //Limpio el buffer de entrada
            codificar();
        }else if(opcion == 2){
            sc.nextLine(); //Limpio el buffer de entrada
            decodificar();
        }else if(opcion == 3){
            System.exit(0);
        }


    }
    public static void codificar(){
        System.out.println("Introduzca el mesaje a codificar sin signos de puntuacion");
        int n = 0;
        while(n>-1){
            men = sc.nextLine().toString(); //Guardo cada palabra del String en la variable en y si quito .toString() el problema sigue
            try{
                mensaje[n] = men; //Asigno cada palabra a un valor del array
            }catch(Exception e){
                e.printStackTrace();
                //Aqui me salta NullPointerException
            }
            System.out.println(mensaje[n]);
                //Y aquí también me salta
            n++;
        }

    }
    public static void decodificar(){

    }
}
1
задан 17.07.2016, 16:24
3 ответа

Как хорошо говорит Саймон, выходит ВґNullPointerExceptionВґ, когда ты пробуешь использовать объект, в твоем случае mensaje (типа Array), раньше это инициализировать. Чтобы использовать переменные обрежь видеть это 2 шагами:

  1. Объявлять ее: Будучи в этом шаге, когда твоя программа размещает место в памяти ram, чтобы потом мочь хранить данных в ней (имея в виду тип переменной, которую ты объявил бы). Эдж: int a;, bool b;, Object c;
  2. Инициализировать ее: Уже с размещенным местом, обрежь сохранять твои данные в таком месте, чтобы потом использовать их. Эдж: a = 2;, b = true, c = new String[10]

В твоем случае ты хочешь использовать array String, следовательно и с любой переменной, после объявляя твою переменную, tenes, чем инициализировать ее.

String mensaje[]; //Declaro 

mensaje = new String[10];//Inicializo

public static String[] mensaje = new String[10];//Todo en una línea.
4
ответ дан 24.11.2019, 13:49

Он выходит у тебя NullPointerException из-за которого никогда ты не инициализируешь переменную mensaje. В простых условиях, ты создал место в памяти для нее array, но никогда это не наполнил с array в если. Легкое решение состоит в том, чтобы менять эту линию:

public static String[] mensaje = new String[10];

где 10 это число мест, которые ты хочешь, чтобы у него был твой array (ты можешь менять это в число, которое ты хочешь). Прими во внимание, что Arrays у них есть предопределенный размер (когда ты инициализируешь array с размером, ты не можешь делать это большим ни более маленьким). Если ты хочешь array с динамическим размером, я предлагаю тебе один ArrayList.

1
ответ дан 24.11.2019, 13:49

В java эти две линии эквивалентные:

public static String[] mensaje;

и

public static String[] mensaje = null;

И признаку (класса) "сообщение" никогда не дало ему другую отличную стоимость в null, и поэтому у него есть null, который поднимает в конце концов вышеупомянутое исключение это, попробовав использовать.

0
ответ дан 24.11.2019, 13:49
  • 1
    Верно, что в обоих случаях стоимость mensaje остается у null, но не 100 % верных говорить, что оба решения эквивалентные, потому что в случае, переменной está инициализировавшая, и в другом не, и для составителя, это distinció n важно. –  sstan 30.11.2016, 18:01