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

なぜ使わないのですか

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

コードを読みやすくします。ネストされた条件は混乱しています。それらを修正する場合は、エラーを修正することもできます (表示されたコードの一部にある場合)。

また追加

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

メソッドの開始時に、期待どおりのものが実際に受信されるかどうかを確認します。

于 2012-12-06T18:51:49.413 に答える
3

わかりました

はい、コードは for(int x =1;x<8;x++){ day[x-1] = JOptionPane.showInputDialog("Enter hourpairs for day "+x +" を使用して、その前の for ループで初期化されています。 .\n 1 桁目を入力してください: "); day[x] = JOptionPane.showInputDialog("2桁目を入力してください: "); 配列に入れられる文字は、前に投稿した 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 に答える