0

ユーザーが入力ステートメントに何も入力しないと、エラーが発生します。代わりに Try/Catch ブロックを使用して例外をスローし、boolAskRepeat を true に設定して、コードの最後までスキップしてループを繰り返すことを考えました。

これは機能しません。何かが足りないと思いますが、何がわからないのですか...それでも例外がスローされます:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
    at java.lang.String.charAt(Unknown Source)
    at ITSLab03.main(ITSLab03.java:34)

このコード行はどれですか:inputStatus = input.readLine().toLowerCase().charAt(0);

ここで何が間違っていますか?

while (boolAskStatus == true)
{
    System.out.print("Employment Status (F or P): ");

    try 
    { 
        inputStatus = input.readLine().toLowerCase().charAt(0); 

        if (inputStatus == "f".charAt(0))
        {
            boolAskStatus = false;

            String stringCheckSalary = null;
            boolean boolCheckSalary = true;
            while (boolCheckSalary == true)
            {
                // some code
            }

            outputData(inputName, inputStatus, calculateFullTimePay(inputSalary));
        }
        else if (inputStatus == "p".charAt(0))
        {
            // some code                

            outputData(inputName, inputStatus, calculatePartTimePay(inputRate, inputHours));
        }
        else boolAskStatus = true;

    } 
    catch (IOException e) { boolAskStatus = true; }
}
4

4 に答える 4

2

input.readLine().toLowerCase().charAt(0)をスローするため、コードは希望どおりに機能しませんStringIndexOutOfBoundsException。これは、ではないIOExceptionため、catchブロックがヒットすることはありません。キャッチをに変更することで動作させることができます

catch (StringIndexOutOfBoundsExceptione e) { boolAskStatus = true; }

だが...

通常、プログラムの通常の動作を例外処理に基づいて行うことはお勧めできません。例外スローは発生する可能性があるものと考えてください。ただし、通常は発生しません。次のようなものを使用してみませんか。

final String STATUS_F = "f";
final String STATUS_P = "p";

String fromUser = null;
do {
    String rawInput = input.readLine().toLowerCase();
    if (rawInput.startsWith(STATUS_F)) {
        fromUser = STATUS_F;
    } else if (rawInput.startsWith(STATUS_P)) {
        fromUser = STATUS_P;
    }
} while (fromUser == null);

if (STATUS_F.equals(fromUser)) {
    // do something
} else if (STATUS_P.equals(fromUser)) {
    // do something else
} else {
    // Shouldn't be able to get here!
    throw new Exception("WTF!?");
}

これを読んでいる他の人にとって、プログラムがループする理由とループの制御方法を理解するのははるかに簡単です。これは、ユーザーが入力している内容を把握するコードと、その情報をどう処理するかを決定するコードが分離されているためです。さらに、例外に対処する必要はありません。

于 2012-09-21T22:18:57.383 に答える
2

を使用する.charAt(0)と、文字列の長さが 0 より大きいと想定されます。

次のようにするだけで、これを簡単にすることができます。

String entry = input.readLine().toLowerCase();
if (entry.startsWith("f")) {
    ...
}
else if ("entry".startsWith("p")) {
    ...
}
于 2012-09-21T21:06:40.593 に答える
2

通常の try catch パターンは次のようになります。

try
{
    // code that is vulnerable to crash
}
catch (Specific-Exception1 e1)
{
    // perform action pertaining to this exception
}    
catch (Specific-Exception2 e2)
{
    // perform action pertaining to this exception
}    
....
....
catch (Exception exp) // general exception, all exceptions will be caught
{
    // Handle general exceptions. Normally i would end the program or 
    // inform the user that something unexpected occurred.
}
于 2012-09-21T21:02:11.547 に答える
2

同様にキャッチする必要がありStringIndexOutOfBoundsExceptionます(スタックトレースを適切に観察すると、これは例外です)

  catch (StringIndexOutOfBoundsException e) {
            boolAskStatus = true;  
      }

(または)Exceptionすべての実行時例外をキャッチするcatch

catch (Exception e) {
                boolAskStatus = true;  
          }
于 2012-09-21T20:58:20.540 に答える