Выдаёт ошибку при использовании Scanner

Всем привет. При попытке ввода элементов в массив выдаёт ошибку - Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.util.Scanner.nextInt()" because "Main.scn" is null at Main.inputElements(Main.java:35) at Main.main(Main.java:24) Подскажите пожалуйста в чём проблема

Код:

import java.util.InputMismatchException;
import java.util.Scanner;
import java.util.Arrays;

public class Main {
    private static Scanner scn;
    public static void main(String[] args) {
        Scanner scn = new Scanner(System.in);
        System.out.println("Cпосіб заповнення" +
                "\n1. Введення з клавіатури. " +
                "\n2. Рандом.");
        int chose = scn.nextInt();
        switch (chose){
            case 1:
                System.out.println("Розмір масиву: ");
                int size;
                try {
                    size = scn.nextInt(); //ввод размера массива
                } catch (InputMismatchException inputMismatchException) {
                   throw new InputMismatchException("Ввод только чисел");
                }
                int[] array = new int[size];
                inputElements(array);
                System.out.println(array);
                break;
            case 2:

                break;
        }
    }
    private static void inputElements(int[] array){
        System.out.println("Элементы массива:");
        for (int i = 0; i < array.length; i++) {
           array[i] = scn.nextInt(); //ввод элементов массива
        }
    }

}

Ответы (1 шт):

Автор решения: had0uken

Исправил несколько ваших ошибок и пометил их комментариями.

  1. Вы когда выводите массив на экран - у вас не получится это сделать, так как у объекта массив целых чисел не переопределен метод toString. Правильнее пользоваться статическим классом Arrays.

  2. Вы когда считываете целое число сканером, вы кроме цифры, например "4" передаете еще и символ перевода строки "\n" когда нажимаете Enter. метод nextInt() съедает цифру, но при этом ничего не делает с символом перевода строки. И именно этот символ "лезет" в ваш следующий метод scn.nextInt(). Java видит что это не инт и выбрасывает исключение. Выход: после каждой вычитки целого значения использовать команду scn.nextLine(); она "съест" лишний символ перевода строки, и продолжится корректное выполнение программы.

  3. Сканнер нужно закрывать scanner.close(). upd. НЕ НУЖНО!!! (Объяснение в комментариях)

     public class Main {
     private final static Scanner scn = new Scanner(System.in);
    
     public static void main(String[] args) {
    
         System.out.println("Cпосіб заповнення" +
                 "\n1. Введення з клавіатури. " +
                 "\n2. Рандом.");
    
         int chose = scn.nextInt();
         scn.nextLine();        /// сброс сканера
         switch (chose) {
             case 1:
                 System.out.println("Розмір масиву: ");
                 int size;
                 try {
                     size = scn.nextInt();
                     scn.nextLine();         //// сброс сканера
                     //ввод размера массива
                 } catch (InputMismatchException inputMismatchException) {
                     throw new InputMismatchException("Ввод только чисел");
                 }
                 int[] array = new int[size];
                 inputElements(array);
                 System.out.println(Arrays.toString(array)); // не правильный вывод на экран массива
                 //System.out.println(array);
                 break;
             case 2:
    
                 break;
         }
         scn.close();        //// Сканнер нужно закрывать
     }
    
     private static void inputElements(int[] array) {
    
         System.out.println("Элементы массива:");
         for (int i = 0; i < array.length; i++) {
    
             array[i] = scn.nextInt();
             scn.nextLine();//ввод элементов массива
         }
    
     }
    

    }

→ Ссылка