【问题标题】:For loop error, how do i fix this?对于循环错误,我该如何解决?
【发布时间】:2012-11-24 21:12:20
【问题描述】:
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 循环并运行此方法,它就会出现异常。

【问题讨论】:

  • 你到底得到了什么错误信息?
  • 请在源文件中发布可编译的代码,否则请相应地对其进行注释。
  • TimeSheets.main 的“if(entering.equalsIgnoreCase("a"))”处的 TimeSheeting.changeLetters(TimeSheeting.java:8) 线程“main”java.lang.NullPointerException 中的异常(TimeSheets.java:33) 在 for 循环中
  • 你想创建类似entering = String.valueOf(entering.toLowerCase().charAt(0)-'a'+10)的东西吗?
  • 数组中的值是否已初始化?如果是,那么您没有向我们展示负责NullPointerException 的代码。

标签: java string loops for-loop char


【解决方案1】:

正如@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" : {

        // ...
    }

    // ...
}

【讨论】:

    【解决方案2】:

    根据

    是的,代码在 for 循环中初始化,然后使用 for(int x =1;x

    你有一个逻辑错误。您正在覆盖以前的条目,而不是将数组填充到最多 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);
    }
    

    【讨论】:

    • 对于a-h 之外的值,该方法应根据他当前的代码返回输入。
    • @jlordo 我不确定,也许 15013513 否则 OP 没有机会写下剩余的内容。他的问题似乎是 NPE,而他给出的代码无论如何都无关紧要。
    【解决方案3】:

    你为什么不使用

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

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

    同时添加

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

    在你的方法开始时,看看是否真的收到了你期望它收到的东西。

    【讨论】:

    • +1,很好的建议,即使它不能直接解决问题。
    • 谢谢,我知道这不是一个真正的答案,但评论太多了;)
    • 或 switch(entering) ...,如果你使用 Java7! .
    • @invariant 是 switch 可能与 equalsIgnoreCase() 吗?
    • @jlordo nope,switch(entering.toLowerCase()) ... 这个问题怎么样!
    猜你喜欢
    • 1970-01-01
    • 2021-11-03
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 2016-07-21
    • 2018-11-10
    相关资源
    最近更新 更多