ArrayIndexOutOfBoundsException с массивом, достаточно большим для хранения данных, которые я ему предоставляю - PullRequest
0 голосов
/ 04 июля 2011

Я сделал следующий метод:

static int GenerateSeccondPal(int x){
    String y = Integer.toString(x);
    char[] z1 = y.toCharArray();
    char[] z2 = new char[y.length() / 2];

    for (int count = (z1.length /2); count <= z1.length; count++) {
        z2[count] = z1[count];
    }
    return Integer.parseInt(new String(z2));

}

Однако, когда я запускаю его, я получаю эту ошибку:

Исключение в потоке "main" java.lang.ArrayIndexOutOfBoundsException: 3 на вызовы. Проблема_4.GenerateSeccondPal (Problem_4.java:31) при вызовах. Проблема_4.main (Problem_4.java:6)

Что странно, потому что другой метод, который я сделал:

static int GenerateFirstPal(int x) {
    String y = Integer.toString(x);
    char[] z1 = y.toCharArray();
    char[] z2 = new char[z1.length / 2];

    for (int count = 0; count < z1.length / 2; count++) {
        z2[count] = z1[count];
    }
    return Integer.parseInt(new String(z2));

}

Работает отлично. Что не так с тем, что я написал?

Ответы [ 4 ]

3 голосов
/ 04 июля 2011

Другие указали на проблемы с массивами, но я не понимаю, почему вы вообще используете массивы.Просто используйте substring:

static int generateFirstPal(int x) {
    String y = String.valueOf(x);
    String firstPart = y.substring(0, y.length() / 2);
    return Integer.parseInt(firstPart);
}

static int generateSecondPal(int x) {
    String y = String.valueOf(x);
    String secondPart = y.substring(y.length() / 2);
    return Integer.parseInt(secondPart);
}

Честно говоря, это все равно странный дизайн ... вы уверены это правильное поведение с самого начала?Учитывая, что вы имеете дело с числами, непонятно, зачем вам вообще нужно строковое представление.В зависимости от ожидаемой длины строк, я бы ожидал что-то вроде этого:

static int generateFirstPal(int x) {
    return x / 1000;
}

static int generateSecondPal(int x) {
    return x % 1000;
}

Это разделит 123456 на 123 и 456, например.Отрегулируйте 1000 в соответствии с вашими реальными значениями.

1 голос
/ 04 июля 2011

Ваша переменная count не начинается с 0, поэтому вам нужно перевести сумму таким образом, чтобы z2 [count] начинался с 0 в for, а не с z1.length / 2

1 голос
/ 04 июля 2011

Ваш <=, вероятно, должен быть <, чтобы избежать этого исключения.

0 голосов
/ 04 июля 2011

В тот момент, когда вы это делаете:

for (int count = (z1.length /2); count <= z1.length; count++)
{ 
 z2[count] = z1[count];
} 

Предположим, что z1.length равно 7, а z2.length равно 4, это означает, что ваша программа завершится сбоем, поскольку z2 не имеет индекса 4, максимум только 3.

Я думаю, что вы должны начать свой счетчик = 0 и выполнять итерацию пока count

...