0
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 循环并运行此方法,它就会出现异常。

4

3 回答 3

4

why don't you use

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

to make your code more readable. Your nested conditions are a mess. If you fix them, you might as well fix the error (if it's in the part of code you showed us).

Also add

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

at the beginnig of your method to see if really receives what you are expecting it to receive.

于 2012-12-06T18:51:49.413 回答
3

好的,根据

是的,代码在 for 循环中初始化,然后使用 for(int x =1;x<8;x++){ day[x-1] = JOptionPane.showInputDialog("Enter hours pairs for day "+x +" .\n 输入第一个数字:"); day[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);
}
于 2012-12-06T18:56:28.393 回答
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" : {

        // ...
    }

    // ...
}
于 2012-12-06T19:14:10.473 回答