Ошибка: java.lang. NullPointerException

Я - новичок в Java и у меня есть сомнение в теме реестров. Я реализую программу управления статей, которое позволяло бы, между другими вещами, выписывать статью. Максимальное число статей, которое может быть, он 100. Они спрашивают у нас код статьи, и если уже существует статья с этим кодом, не будет возможно выписывать. Далее я пишу то, что я реализовал благодаря помощи этого форума:

public class Main {

public static void main(String[] args) {

    final int MAXARTICULOS = 100; // {número de artículos máximos de la ferretería}

    class Articulo implements Serializable {

        String codart; // {código del articulo}
        String nombre; // {nombre del artículo}
        String caracteristicas; // {características}
        double precio; // {precio del artículo}
        int cantidad; // {cantidad de artículos en stock}
    }

    Articulo[] misArticulos = new Articulo[MAXARTICULOS]; // {array que contiene los artículos}
    Scanner entrada = new Scanner(System.in);
    int menu;

    System.out.println("FERRETERIA");

    for (int i = 0; i < misArticulos.length; i++) {
        System.out.println("Introduce el código: ");
        String codigo = entrada.nextLine();
        boolean encontrado = false;
        for (int j = 0; !encontrado && j < i - 1; j++) {
            if (misArticulos[j].codart.equals(codigo)) {
                System.out.println("Articulo existente");
                encontrado = true;
            }
        }

        if (!encontrado) {
            System.out.println("Introduce el nombre: ");
            misArticulos[i].nombre = entrada.nextLine();
            System.out.println("Introduce las características: ");
            misArticulos[i].caracteristicas = entrada.nextLine();
            System.out.println("Introduce el precio: ");
            misArticulos[i].precio = entrada.nextDouble();
            System.out.println("Introduce la cantidad: ");
            misArticulos[i].cantidad = entrada.nextInt();
            entrada.nextLine();
        }
    }

} // fin main

Однажды обнаруженный, что статья не существует, нужно вводить имя, характеристики, цена и количество, но выполнять только позволяет мне вводить имя и потом отпускает исключение java.lang. NullPointerException.

1
задан 03.01.2017, 23:03
0 ответов

Проблема, из-за которой тебя отпускает исключение NullPointerException он благодаря тому, что ты обращаешься в поисках до конца одного array который ты даже не наполнил совсем. Ты был бы должен приносить переменную int в которой ты принес счет элементов, которые ты приносишь, и реализовывать поиски с 0 до этой переменной.

С другой стороны, если ты сосредотачиваешься на циклах for укрытые, ты повторяешь на той же переменной i, re инициализируя ее в ноль снова и снова. Это сделает, что во втором повторении главного цикла не между, потому что она i уже он стоит misArticulos.length (). Для этого ты должен использовать другую вторую переменную j следующего способа:

    for(int i = 0; i < misArticulos.length(); i++){
        System.out.println("Introduce el código: ");
        String codigo = entrada.nextLine();
        boolean encontrado = false;
        //buscas hasta que lo encuentras o hasta que llegas al numero de elementos actual
        for (int j = 0; !encontrado && j < i - 1; j++){
            if (misArticulos[j].codart.equals(codigo)){
                System.out.println("Articulo existent");
                encontrado = true;
            }
        }
        if (!encontrado)
            //pides los datos y los metes en misArticulos[i]
    }

Существуют структуры данных как HashMap у которого есть методы, чтобы подтверждать, уже существует ли информация, данная без необходимости пробегать всю структуру, но если ты - новичок в java, я рекомендую тебе использовать один array. Если он интересует тебя, ты можешь знать больше в этой ссылке: http://jarroba.com/map-en-java-con-ejemplos/

0
ответ дан 03.12.2019, 17:53

Идея состоит в том, чтобы сначала ты пробежал array, и смотрел, существует ли он, перед тем, как не делать больше ничего, таково, который я схватил:

boolean encontrado = false;
System.out.println("Introduce el código: ");
String code = entrada.nextLine();
for (int i = 0; i < misArticulos.length; i++) {
   if ((misArticulos[i].codart).equalsIgnoreCase(code)) {
     System.out.println("El código ya existe");
     encontrado = true;
  }
}

if (!encontrado) {
  //Dar de alta
}

Если booleano encontrado будь в false, дело в том, что он не существует, следовательно там ты был бы должен выписывать.

PD: Если свойство codart твоего объекта Articulo его один Integer, или другая вещь, которая не String, ты был бы должен делать parse, так как метод equalsIgnoreCase только он действительный, чтобы сравнивать цепи.

0
ответ дан 03.12.2019, 17:53