0

多くの人が構文とロジックが正しいと言っていましたが、これを機能させることはできません。誰かが私が間違っている可能性があることを明らかにできますか?

public Scanner in = new Scanner(System.in);

public void movePlayer() {
    System.out.print("move: ");
    String str = in.nextLine();

    in.nextLine();

    char c = str.charAt(0);

    if (c == 'l' || c == 'L') {
        player.moveLeft();
    }
 }

プログラムは char でキャッチされますc = str.charAt(0);

そして、私はこのエラーを返しています:

java.lang.StringIndexOutOfBoundsException: 文字列インデックスが範囲外です: 0 (java.lang.String 内)

4

7 に答える 7

5

コンソールから何も入力していないため、str空です。chatAt(0)これが例外をスローする理由です

于 2012-04-30T11:26:08.900 に答える
3

を使用したくありませんnextLine()。を使用しますnext()

String str = in.next();

これは Javadoc です。nextLine()

このスキャナを現在の行を超えて進め、スキップされた入力を返します。このメソッドは、最後の行セパレーターを除いて、現在の行の残りを返します。位置は次の行の先頭に設定されます。

代わりnext()に:

このスキャナーから次の完全なトークンを検索して返します。完全なトークンの前後には、区切り文字パターンに一致する入力が続きます。以前の hasNext() の呼び出しで true が返された場合でも、このメソッドは入力がスキャンされるのを待っている間にブロックされる場合があります。

これにより、空の行を消費して例外を発生させることがなくなります。

于 2012-04-30T11:26:48.357 に答える
0

コンソールでEnterキーを押すScannerと、テキストが入力されているかどうかに関係なく、完全な行と見なされます。

行の先頭でEnterキーを押すと、文字列""がメソッドScanner.nextLine()に返されます。

str.lenght () > 0beforeでチェックを追加しstr.charAt(0)ます。

于 2012-04-30T11:47:28.197 に答える
0

これstrは空であることを意味します。null空でないかどうかを確認する必要があります。

if (str != null && !str.isEmpty()) {
...
}
于 2012-04-30T11:26:40.637 に答える
0

それはryt .. 0番目の位置に到達しようとするとchar、サイズf配列が0であるため、例外がスローされるためです。

コマンドラインから I/Oを取得するためにこれを読んでいるかもしれません

于 2012-04-30T11:32:44.357 に答える
0

空の文字列と Null のチェックも追加します。多くの頭痛を避けることができます。

于 2012-04-30T11:35:36.810 に答える