ArrayIndexOutOfBoundsException в преобразовании римской цифры в целое число - PullRequest
0 голосов
/ 31 марта 2019

Мне нужно написать программу, которая преобразует римскую цифру в соответствующее ей целочисленное значение, но я продолжаю получать ошибку java.lang.ArrayIndexOutOfBoundsException. Каждый раз, когда я что-то меняю, выводится неверное значение. Может кто-нибудь сообщить мне, где я иду не так?

char n1[] = {'C', 'X', 'I', 'I', 'I'};
int result = 0;
for (int i = 0; i < n1.length; i++) {
  char ch = n1[i];
  char next_char = n1[i + 1];

  if (ch == 'M') {
    result += 1000;
  } else if (ch == 'C') {
    if (next_char == 'M') {
      result += 900;
      i++;
    } else if (next_char == 'D') {
      result += 400;
      i++;
    } else {
      result += 100;
    }
  } else if (ch == 'D') {
    result += 500;
  } else if (ch == 'X') {
    if (next_char == 'C') {
      result += 90;
      i++;
    } else if (next_char == 'L') {
      result += 40;
      i++;
    } else {
      result += 10;
    }
  } else if (ch == 'L') {
    result += 50;
  } else if (ch == 'I') {
    if (next_char == 'X') {
      result += 9;
      i++;
    } else if (next_char == 'V') {
      result += 4;
      i++;
    } else {
      result++;
    }
  } else { // if (ch == 'V')
    result += 5;
  }
}
System.out.println("Roman Numeral: ");
for (int j = 0; j < n1.length; j++)
{
  System.out.print(n1[j]);
}
System.out.println();
System.out.println("Number: ");
System.out.println(result);

Ответы [ 3 ]

0 голосов
/ 31 марта 2019

Ваша for петля идет от i = 0 до i = n1.length - 1, поэтому линия

char next_char = n1[i + 1];

всегда вызывает исключение ArrayIndexOutOfBoundsException.

Из википедии , римские цифры состоят из трех независимых групп:

  1. М, ММ, МММ;
  2. C, CC, CCC, CD, D, DC, DCC, DCCC, CM;
  3. X, XX, XXX, XL, L, LX, LXX, LXXX, XC; и
  4. I, II, III, IV, V, VI, VII, VIII, IX.

Советую разобрать их по отдельности.

0 голосов
/ 31 марта 2019

Остальные правы по поводу причины. Я думаю, вы можете просто установить next_char (который в соответствии с соглашениями об именах должен быть nextChar) равным фиктивному значению, которое не соответствует ни одной букве, используемой римскими цифрами, в случае, если нет следующего символа:

      char nextChar;
      if (i + 1 < n1.length) {
        nextChar = n1[i + 1];
      } else {
        nextChar = '\0';
      }

С этим изменением ваша программа печатает:

Roman Numeral: 
CXIII
Number: 
113

Vitor SRG также прав, что ваша программа не проходит валидацию, что не очень хорошо.

0 голосов
/ 31 марта 2019

Это вызывает массив вне границ. Вы можете снова смоделировать цикл for, чтобы проверить этот индекс

  char next_char = n1[i + 1];
...