对于循环错误,我该如何解决这个问题?

时间:2012-12-06 18:48:16

标签: java string loops for-loop char

for(int x = 0;x<14;x++){
    day[x]= theSheet.changeLetters(day[x]);
}

public String changeLetters(String entering){
    if(entering.equalsIgnoreCase("a")){
        entering = "10";
    } else {
        if(entering.equalsIgnoreCase("b")){
            entering = "11";
        } else {
            if(entering.equalsIgnoreCase("c")){
                entering = "12";
            } else {
                if(entering.equalsIgnoreCase("d")){
                    entering = "13";
                } else {
                    if(entering.equalsIgnoreCase("e")){
                        entering = "14";
                    } else {
                        if(entering.equalsIgnoreCase("f")){
                            entering = "15";
                        } else {
                            if(entering.equalsIgnoreCase("g")){
                                entering = "16";
                            } else {
                                if(entering.equalsIgnoreCase("h")){
                                    entering = "17";
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    return entering;
}

说错误在if(entering.equalsIgnoreCase("a")),在我用来运行方法的for循环中。我正在尝试将放入字符串的字母更改为数字。

任何人都可以向我解释错误的位置吗?我发现问题时遇到了麻烦。它让我输入字母很好但是一旦它到达for循环并运行这个方法就有一个例外。

3 个答案:

答案 0 :(得分:4)

为什么不使用

if (condition) {
    // ...
} else if (condition2) {
   // ...
} else if (condition3) {
   // ...
}
// and so on

使您的代码更具可读性。你的嵌套条件是一团糟。如果您修复它们,您也可以修复错误(如果它出现在您向我们展示的代码部分中)。

同时添加

System.out.println("Entering = '" + entering "'");

在您的方法的开头,看看是否真的收到了您期望收到的内容。

答案 1 :(得分:3)

根据

确定
  

是的,代码在使用之前在for循环中初始化   for(int x = 1; x&lt; 8; x ++){day [x-1] = JOptionPane.showInputDialog(“Enter   日期的小时对“+ x +”。\ n输入第一个数字:“);日[x] =   JOptionPane.showInputDialog(“输入第二个数字:”); } 这些信   然后使用for将数组放入数组中   循环发布。

您有逻辑错误。您正在覆盖以前的条目,而不是最多填充14个项目。因此,8之后的项目会留下null,因此NullPointerException

试试这个:

String[] day = new String[14];

for( int i = 0; i < 14; i+=2 ) {
    day[i] = JOptionPane.showInputDialog("Enter hour pairs for day "+(i/2+1) +".\n Enter the first digit: ");
    day[i+1] = JOptionPane.showInputDialog("Enter the second digit: ");
}

作为奖励,您可以使用以下内容简化if-else代码:

public String changeLetters( String entering ) {
    return String.valueOf(entering.toUpperCase().charAt(0) - 55);
}

答案 2 :(得分:0)

正如@jlordo已经说过的那样,避免使用具有这种深度的嵌套if语句。

作为替代方案,您可以将switch语句与enum组合使用 - 尽管以下方法包含更多代码,但它更通用且更适合扩展(例如使用字母表中的所有字母)并且它将使代码更具可读性,更适合于你想表达的内容。

Letter letter;

if (letter.equals("a")) letter = Letter.a;
if (letter.equals("A")) letter = Letter.A;
// and so on ...

switch (letter) {
    case a : { 
        // do some code here ...
        break;
    }
    case A : { 
        // do some code here ...
        break;
    }
    // and so on ...
}

public enum Letter {
    a (1),
    A (2),
    b (3),
    B (4),
    c (5),
    C (6);
    // and so on

    private final int index;

    Letter(int i) {

        index = i;
    }

    public int getIndex () {

        return index;
    }
}

请注意,如果您使用的是Java 7,即使没有枚举也可以使用switch语句,因为它接受字符串,如下所示:

switch (entering) {

    case "a" : {

        // ...
    }

    // ...
}