Выдаёт ошибку при использовании 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 шт):
Исправил несколько ваших ошибок и пометил их комментариями.
Вы когда выводите массив на экран - у вас не получится это сделать, так как у объекта массив целых чисел не переопределен метод toString. Правильнее пользоваться статическим классом Arrays.
Вы когда считываете целое число сканером, вы кроме цифры, например "4" передаете еще и символ перевода строки "\n" когда нажимаете Enter. метод nextInt() съедает цифру, но при этом ничего не делает с символом перевода строки. И именно этот символ "лезет" в ваш следующий метод scn.nextInt(). Java видит что это не инт и выбрасывает исключение. Выход: после каждой вычитки целого значения использовать команду scn.nextLine(); она "съест" лишний символ перевода строки, и продолжится корректное выполнение программы.
Сканнер нужно закрывать 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();//ввод элементов массива } }}