Проблемы с пользовательским вводом в java - PullRequest
0 голосов
/ 11 апреля 2020

Я новичок в java и до сих пор привыкаю к ​​большей части синтаксиса. Здесь я попытался получить два ввода (первый - int, а второй - строку), а затем один, я сделал некоторые вычисления с ними. Но когда я запускаю программу, она выдает следующее сообщение:

Exception in thread "main" java.lan._NumberFormatException: For input string: "" 
at java.lang.NumberFormatException.forInputString(NuthberFormatException.java:65) 
at java.lang.Integer.parseInt(Integer.java:592) 
at java.lang.Integer.parseInt(Integer.java:615) 
at Main.main(Main.java:13) 

.

import java.util.Scanner;  
import java.util.Arrays;
public class Main {
   public static void main(String args[]) {
    Scanner myObj = new Scanner(System.in);  
    int N = myObj.nextInt();
    String Input = myObj.nextLine();
    String[] Inputs = Input.split(" ", 0);
    int size = Inputs.length;
      int [] a = new int [size];
      for(int i=0; i<size; i++) {
         a[i] = Integer.parseInt(Inputs[i]);
      }
  }
}

Насколько я понимаю, программа принимает оба входа как одинаковые. Но как мне это исправить?

1 Ответ

0 голосов
/ 11 апреля 2020

Вам следует решить следующие проблемы с вашим кодом:

  1. Хотя это не существенно с точки зрения выполнения, вы всегда должны отображать сообщение для ввода (пример приведен ниже) ; в противном случае пользователь остается невежественным.
System.out.println("Enter a few integers separated by a space: ");
String Input = myObj.nextLine();
Хотя это не существенно с точки зрения выполнения, вы всегда должны следовать Java соглашениям о присвоении имен например, int N должно быть записано как int n, а String[] Inputs должно быть String[] inputs согласно соглашениям об именах. Поскольку вы ничего не делаете с N, удалите строку, int N = myObj.nextInt();. Даже если вы удалите строку, int N = myObj.nextInt();, вы можете грань NumberFormatException для ввода типа 10 20 30, где есть более одного пробела. Вы должны разделить на "\\s+" вместо " ", который учитывает только один пробел. Обратите внимание, что "\\s+" позаботится об одном или нескольких пробелах. Наконец, даже если вы разделите на "\\s+", вы можете столкнуться с NumberFormatException для таких вводов, как 10 x 30, которые имеют нецелую запись например, x, который не может быть проанализирован в целое число. Чтобы справиться с такими случаями, вам нужно обработать NumberFormatException, как указано ниже:
// ...
for (int i = 0; i < size; i++) {
    try {
        a[i] = Integer.parseInt(Inputs[i]);
        // ...
    } catch (NumberFormatException e) {
        System.out.println("Ignoring " + Inputs[i] + " as it is not an integer.");
        a[i] = Integer.MIN_VALUE;
    }
    // ...
}
// ...

Обратите внимание, что a[i] = Integer.MIN_VALUE; устанавливает Integer.MIN_VALUE в массив для недопустимых записей. Вы можете поставить другое значение, просто игнорируя его согласно вашему требованию. Если вы проигнорируете его, этот индекс будет иметь значение по умолчанию int, равное 0.

Не стесняйтесь комментировать в случае каких-либо сомнений / проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...