Индекс массива строк - PullRequest
0 голосов
/ 03 июля 2018

Я кодирую в базовой системе ввода и идентификатора пользователя, но я не могу понять эту проблему индексации. Я понимаю, что массивы индексируются в 0, и в моем коде я выполняю цикл while (я пробовал цикл for, но у меня возникла та же проблема), проверяя i-ую позицию массива с введенным пин-кодом. по какой-либо причине я получаю эту ошибку:

Process: com.example.gabeskillerpcjr.assemblylineapp, PID: 17838 java.lang.ArrayIndexOutOfBoundsException: length=3; index=3
    at com.example.gabeskillerpcjr.assemblylineapp.FourDtForm.exportVarifaction(FourDtForm.java:350)
    at com.example.gabeskillerpcjr.assemblylineapp.FourDtForm$3.onClick(FourDtForm.java:264)

Вот мой простой цикл while, int i инициализируется в 0:

public void exportVarifaction(){
    String[] PinsNums = new String[]{"1415","1678","1923"};
    String[] PinNames = new String[]{"admin","test","test1"};
    String tmp;
    boolean done = false;
    while (!done) {
        tmp = PinsNums[i];
        if (tmp.equals(keyPadNumsEntered)) {
            result = PinNames[i];
            loggedOn = true;
            done = true;
        } else {
            ++i;
            result = "no logon";
        }
    }
}

Ответы [ 5 ]

0 голосов
/ 03 июля 2018

Другие ответы верны, что у вас нет подходящего условия выхода. Хотя цикл for был бы более уместным.

String result = "no logon";
for (String tmp : PinNums) {
    if (tmp.equals(keyPadNumsEntered) {
        result = tmp;
        loggedOn = true;
    }
}

Хотя даже лучше может быть просто contains.

if (Arrays.asList(PinNums).contains(keyPadNumsEntered)) {
    result = keyPadNumsEntered;
    loggedOn = true;
}
0 голосов
/ 03 июля 2018

Ваш цикл while не прерывается, если он не получает пин-код в вашем массиве.

Просто проследите, что произойдет, если tmp = "9999"? и i = 2? ваш цикл while будет повторяться в третий раз, вызывая выход индекса за пределы. Я бы предпочел использовать цикл for:

for(int i = 0; i < pinsNum.length; i++) {
    //Do work here
}

Таким образом, вы можете использовать оператор if внутри цикла for для переключения loggedon, а затем проверить его снова вне цикла for:

if(loggedon) {
    //Something happens
}
else {
    //Something also happens
}
0 голосов
/ 03 июля 2018

Необходимо проверить, завершен ли цикл в массиве, проверив переменную i и длину массива.

 while (!done && i<PinsNums.length) {
        tmp = PinsNums[i];
        if (tmp.equals(keyPadNumsEntered)) {
            result = PinNames[i];
            loggedOn = true;
            done = true;
        } else {
            ++i;
            result = "no logon";
        }
    }
0 голосов
/ 03 июля 2018

Используемый цикл while и логическое значение done абсолютно не нужны. Вы получаете это исключение, потому что что, если 'tmp' никогда не равняется 'keyPadNumsEntered'? Он будет продолжать итерацию, вызывая исключение IndexOutOfBoundsException. Это было бы намного более читабельным, как цикл for, и это должно предотвратить исключение:

public void exportVarifaction(){
    String[] PinsNums = new String[]{"1415","1678","1923"};
    String[] PinNames = new String[]{"admin","test","test1"};
    String tmp;
    for (int i = 0; i < PinsNums.length; i++) {
        tmp = PinsNums[i];
        if (tmp.equals(keyPadNumsEntered)) {
            result = PinNames[i];
            loggedOn = true;
            break;
        } 
    }
    if (!loggedOn) {
        result = "no logon";
    }
}
0 голосов
/ 03 июля 2018

Вам не хватает условия, чтобы остановить цикл после того, как вы перебрали весь массив. E.g.:

while (!done) {
    tmp = PinsNums[i];
    if (tmp.equals(keyPadNumsEntered)) {
        result = PinNames[i];
        loggedOn = true;
        done = true;
    } else {
        ++i;
        result = "no logon";
    }

    if (i == PinsNums.length) {
        done = true;
    }
}
...