Integer.parseInt Путаница

У меня возникают трудности с попыткой создать приложение, которое я кодирую, чтобы различать, является ли ввод args[] пользователя строкой или целым числом. Если введено значение int, оно будет перечислено и добавлено в общем формате сложения. Если значение String введено в args[], будет собран список игнорируемых аргументов (Strin[] игнорируется) и будет напечатан для просмотра пользователем. Я пытаюсь отличить это с помощью вложенных циклов, которые анализируют значение, введенное как значение int, и проверяют, действительно ли это значение args[] String является int, но, будучи довольно новичком в программировании, я столкнулся с препятствием. Какие-либо предложения?

Вот мой код:

public class Addition {


  public static void main(String args[]) {
    int sum = 0;
    String[] ignored = new String[args.length];
    if(args.length == 0) {
      System.out.println("No input values!");
    } else {
      for(int i = 0; i < args.length; i++) {
        if(Character.isDigit(Integer.parseInt(args[i]))) {
          sum += Integer.parseInt(args[i]);
          if(i == 0) {
            System.out.print(args[i]);
          } else if(Integer.parseInt(args[i]) >= 0) {
            System.out.print(" + " + args[i]);
          } else if(Integer.parseInt(args[i]) < 0) {
            System.out.print(" - " + (Integer.parseInt(args[i]) * -1));
          }
        } else if(!Character.isDigit(Integer.parseInt(args[i]))) {
            ignored[i] = args[i];
        }
      } System.out.print(" = " + sum);
    }
  }
}

Я получаю эту ошибку взаимодействия:

   java.lang.NumberFormatException: For input string: "-"
   at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at Addition.main(Addition.java:17)  

person Saffioti    schedule 27.05.2013    source источник
comment
Нет особого смысла вызывать метод Character для int, даже если ваш код работает.   -  person Hovercraft Full Of Eels    schedule 27.05.2013
comment
Если int не является представлением Unicode для char, а у вас нет. Сначала разберись со своей логикой и только потом пиши код.   -  person Hovercraft Full Of Eels    schedule 27.05.2013
comment
Я пытаюсь заставить приложение различать, является ли значение, которое вводит пользователь, строковым или целочисленным значением. Любые фактические предложения или объяснения, почему это не имеет смысла?   -  person Saffioti    schedule 27.05.2013


Ответы (2)


Ну, вы можете либо А) определить, что это число, а затем проанализировать его, либо Б) попытаться проанализировать и изящно обработать его, если это не удается. Поскольку вы суммируете вещи, я предполагаю, что они ДОЛЖНЫ быть числом, поэтому давайте возьмем B.

Что-то простое, как это, будет работать в вашем случае:

int badArgs = 0;
for(int i = 0; i < args.length; i++) {

  try {
    int value = Integer.parseInt(args[i]);
    // Do your main logic with value here
  } catch (NumberFormatException e) {
    ignored[badArgs++] = args[i];
  }

Текущие проблемы с вашим кодом: проверять .isDigit как вы не имеет смысла - он предназначен для проверки символа из строки - вы уже проанализировали его в этот момент, поэтому, если он собирается бросить NumberFormatException, он уже будет, прежде чем вы закончите проверку. Во-вторых: проверка того, является ли это цифрой, в любом случае не имеет смысла, поскольку -1 является допустимым числом, но, очевидно, не проведет любую проверку, которую вы имели в виду, - и остальная часть вашего кода показывает, что вы намерены обрабатывать отрицания.

person James    schedule 27.05.2013
comment
Спасибо за конструктивный вклад. Это действительно помогло понять ошибки моего кода. - person Saffioti; 27.05.2013

Хорошо, я не совсем понимаю, что вы пытаетесь сделать со своими числами, но вы действительно можете использовать NumberFormatException для достижения того, что вам нужно сделать (разделить числа и не числа).

ArrayList<Integer> numbers = new ArrayList<Integer>();
ArrayList<String> nonNumbers = new ArrayList<String>();

for(String s : args)
{
    try
    {
        int number = Integer.parseInt(s);
        numbers.add(number);
    }
    catch (NumberFormatException nfe)
    {
        nonNumbers.add(s);
    }
}

// rest of your code can use numbers and nonNumbers lists
person Daniel Lerps    schedule 27.05.2013