字符串数组的索引

时间:2018-07-03 19:15:37

标签: java loops android-studio while-loop

我正在使用基本的密码和用户ID系统进行编码,但似乎无法弄清楚这个索引问题。我知道数组的索引为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我初始化为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 :(得分:1)

遍历整个数组后,您缺少停止循环的条件。例如:

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;
    }
}

答案 1 :(得分:1)

您正在使用的while循环和完成的布尔值都是完全不必要的。您正在收到此异常,因为如果'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";
    }
}

答案 2 :(得分:0)

您需要通过检查变量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";
        }
    }

答案 3 :(得分:0)

您的while循环如果没有收到阵列中的引脚,则不会终止。

仅追踪tmp = "9999"会发生什么情况?和i = 2?您的while循环将第三次迭代,导致索引超出范围。我宁愿使用for循环:

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

这样,您可以在for循环内使用if语句来切换loggedon,然后在for循环外再次检查它:

if(loggedon) {
    //Something happens
}
else {
    //Something also happens
}

答案 4 :(得分:0)

其他答案是正确的,因为您没有适当的退出条件。尽管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;
}