1

サマリーが表示されずに困っています。オブジェクトの配列を追加して、以前の Java 割り当てを変更することになっています。ループ内で、個々のオブジェクトをインスタンス化します。ユーザーが配列サイズを超えて別の外部変換を追加し続けることができないことを確認してください。ユーザーがメニューから終了を選択した後、要約レポートを表示するかどうかを尋ねます。「Y」を選択した場合は、オブジェクトの配列を使用して、次のレポートを表示します。

Item     Conversion       Dollars     Amount  
 1       Japanese Yen     100.00    32,000.00   
 2       Mexican Peso     400.00    56,000.00  
 3       Canadian Dollar  100.00     156.00

コンバージョン数 = 3

コンパイル時にエラーはありません..しかし、プログラムを実行すると、0 を押して変換を終了し、要約を表示するかどうかを尋ねるまでは問題ありません。このエラーが表示されます。

スレッド「メイン」での例外 java.lang.StringIndexOutOfBoundsException: 範囲外の文字列インデックス: 0 at java.lang.String.charAt(String.java:658) at Lab8.main(Lab8.java:43)

私のコード:

import java.util.Scanner;
import java.text.DecimalFormat;

public class Lab8
{
    public static void main(String[] args)
    {
        final int Max = 10;
        String a;
        char summary;
        int c = 0;
      Foreign[] Exchange = new Foreign[Max];
      Scanner Keyboard = new Scanner(System.in);

      Foreign.opening();

        do
        {
         Exchange[c] = new Foreign();
           Exchange[c].getchoice();
         Exchange[c].dollars();
         Exchange[c].amount();
         Exchange[c].vertical();
         System.out.println("\n" + Exchange[c]);
         c++;

  System.out.println("\n" + "Please select 1 through 4, or 0 to quit" + >"\n");
         c= Keyboard.nextInt();

        }
          while (c != 0);


        System.out.print("\nWould you like a summary of your conversions? (Y/N): ");
              a = Keyboard.nextLine();
              summary = a.charAt(0);
              summary = Character.toUpperCase(summary);

      if (summary == 'Y')
              {
      System.out.println("\nCountry\t\tRate\t\tDollars\t\tAmount");
                 System.out.println("========\t\t=======\t\t=======\t\t=========");
        for (int i=0; i < Exchange.length; i++)
        System.out.println(Exchange[i]);

          Foreign.counter();
          }
    }
}

43行目とその次の行を見ました: summary = a.charAt(0);

しかし、何が問題なのかわからないのですが、誰か指摘できますか?ありがとうございました。

4

3 に答える 3

1

これは一般的な問題です。を使用するc= Keyboard.nextInt();と、を読み取りますint。このステートメントの間にリターンキーが押された場合a = Keyboard.nextLine();、入力バッファ内の前のステートメントからのサブデューとして空の文字列を読み取ります。

2つのオプションがあります。

  1. Keyboard.nextLine();次のように読み取る前に、バッファをクリーンアップするために追加aしますa = Keyboard.nextLine();

  2. 空の行を読み取る際の問題を回避するために完全な証拠にしたい場合(日付を入力せずにリターンキーを押すことを使用)、次のようにwhileループを配置します。

    a = "";
    while(a.length() <1){
       a = Keyboard.nextLine();
    }
    

    これにより、ループから出たときに、aが確実になります。string length >1本物の入力では、反復は行われません。

于 2012-11-03T05:02:19.377 に答える
1

問題は正確にはその行ではなく、前の while の最後の行にあります。あなたはあなたのint使用を読んだ: -

c= Keyboard.nextInt();

メソッドのドキュメントを見るとScanner#nextInt、ユーザー入力から次のトークンが読み取られます。したがって、整数値を渡すlinefeedと、押した結果として渡される最後の はenterによって読み取られずKeyboard.nextInt、残りは次のように読み取られます。

a = Keyboard.nextLine();

while出口の後。Keyboard.nextIntしたがって、基本的にこのステートメントは、前の呼び出しで残った改行を読み取っているため、最後に a が付いた文字列がa含まれています。したがって、あなたはそれを得ています。emptynewlineException

回避策: -

このステートメントの前に空を起動できます。これは、を入力としてKeyboard.nextLine消費するlinefeedため、次のユーザー入力はその後に開始されます。

    // Your code before this while
} while (c != 0);

Keyboard.nextLine();  // Add this line before the next line

System.out.print("\nWould you like a summary of your conversions? (Y/N): ");
a = Keyboard.nextLine();

または、別の方法Keyboard.nextLineとして、整数値も読み取ることができます。そして、Integer.parseIntメソッドを使用して整数に変換します。ただし、いくつかの例外処理を行う必要があることに注意してください。したがって、まだ について勉強するException Handling必要がある場合は、最初の方法を使用できます。したがって、あなたの中で、次のdo-whileようにすることができます: -

try {
    c = Integer.parseInt(Keyboard.nextLine());
} catch (NumberFormatException e) {
    e.printStackTrace();
}
于 2012-11-03T04:41:41.890 に答える
0

これは、コマンド ライン アプリケーションでキーボード入力を読み取るために Scanner の代わりに使用する Console クラスです。クラスは、Java 1.6 で導入された標準の java.io.Console を「ラップ」することに注意してください。

コンソール クラスから必要なメソッドだけを掘り出して、クラスに直接配置することLab8もできますが、独自の「キーボード」クラスを作成して、後でではなく別のクラスに「懸念事項を分離する」ことに慣れることをお勧めします。 、私のコンソールの縮小版として。

package krc.utilz.io;

import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;


/**
 * A static library of helper methods to read keyboard input.
 * <p>
 * <strong>usage:</strong>
 * <code>
 *   import krc.utilz.io.Console;
 *   while ( (score=Console.readInteger("Enter an integer between 0 and 100 (enter to exit) : ", 0, 100, -1)) != -1) { ... }
 * </code>
 */
public abstract class Console
{
  private static final java.io.Console theConsole = System.console();
  static {
    if ( theConsole == null ) {
      System.err.println("krc.utilz.io.Console: No system console!");
      System.exit(2); // 2 traditionally means "system error" on unix.
    }
  }
  private static final DateFormat dateFormatter = new SimpleDateFormat("dd/MM/yyyy");
  private static final DateFormat timeFormatter = new SimpleDateFormat("HH:mm:ss");

  public static String readString(String prompt) {
    String response = readLine(prompt);
    if(response==null) throw new NullPointerException("response cannot be null");
    return response;
  }

  public static String readLine(String prompt) {
    if (!prompt.endsWith(" ")) prompt += " ";
    System.out.print(prompt);
    return theConsole.readLine();
  }

  public static String readString(String prompt, String regex) {
    while(true) {
      String response = readString(prompt);
      if ( response.length() > 0 ) {
        if ( response.matches(regex) ) {
          return response;
        }
      }
      System.out.println("Oops: A match for "+regex+" is required!");
    }
  }


  public static Date readDate(String prompt) {
    while(true) {
      try {
        return dateFormatter.parse(readString(prompt+" (dd/MM/yyyy) : "));
      } catch (java.text.ParseException e) {
        System.out.println("Oops: "+e);
      }
    }
  }

  public static Date readTime(String prompt) {
    while(true) {
      try {
        String response = readWord(prompt+" (HH:mm:ss) : ");
        return timeFormatter.parse(response);
      } catch (java.text.ParseException e) {
        System.out.println("Oops: "+e);
      }
    }
  }

  public static String readWord(String prompt) {
    while(true) {
      String response = readString(prompt);
      if(response.length()>0 && response.indexOf(' ')<0) return response;
      System.out.println("Oops: A single word is required. No spaces.");
    }
  }

  public static String readWordOrNull(String prompt) {
    while(true) {
      String response = readLine(prompt);
      if(response==null||response.length()==0) return null;
      if(response.indexOf(' ')<0 ) return response;
      System.out.println("Oops: A single word is required. No spaces.");
    }
  }

  public static char readChar(String prompt) {
    while ( true ) {
      String response = readString(prompt);
      if ( response.trim().length() == 1 ) {
        return response.trim().charAt(0);
      }
      System.out.println("Oops: A single non-whitespace character is required!");
    }
  }

  public static char readLetter(String prompt) {
    while(true) {
      String response = readString(prompt);
      if ( response.trim().length() == 1 ) {
        char result = response.trim().charAt(0);
        if(Character.isLetter(result)) return result;
      }
      System.out.println("Oops: A single letter is required!");
    }
  }

  public static char readDigit(String prompt) {
    while(true) {
      String response = readString(prompt);
      if ( response.trim().length() == 1 ) {
        char result = response.trim().charAt(0);
        if(Character.isDigit(result)) return result;
      }
      System.out.println("Oops: A single digit is required!");
    }
  }

  public static int readInteger(String prompt) {
    String response = null;
    while(true) {
      try {
        response = readString(prompt);
        if ( response.length()>0 ) {
          return Integer.parseInt(response);
        }
        System.out.println("An integer is required.");
      } catch (NumberFormatException e) {
        System.out.println("Oops \""+response+"\" cannot be interpreted as 32-bit signed integer!");
      }
    }
  }

  public static int readInteger(String prompt, int lowerBound, int upperBound) {
    int result = 0;
    while(true) {
      result = readInteger(prompt);
      if ( result>=lowerBound && result<=upperBound ) break;
      System.out.println("An integer between "+lowerBound+" and "+upperBound+" (inclusive) is required.");
    }
    return(result);
  }

  public static int readInteger(String prompt, int defaultValue) {
    String response = null;
    while(true) {
      try {
        response = readString(prompt);
        return response.trim().length()>0 ? Integer.parseInt(response) : defaultValue;
      } catch (NumberFormatException e) {
        System.out.println("Oops \""+response+"\" cannot be interpreted as 32-bit signed integer!");
      }
    }
  }

  public static int readInteger(String prompt, int lowerBound, int upperBound, int defaultValue) {
    int result = 0;
    while(true) {
      result = readInteger(prompt, defaultValue);
      if ( result==defaultValue || result>=lowerBound && result<=upperBound ) break;
      System.out.println("An integer between "+lowerBound+" and "+upperBound+" (inclusive) is required.");
    }
    return(result);
  }

  public static double readDouble(String fmt, Object... args) {
    String response = null;
    while(true) {
      try {
        response = System.console().readLine(fmt, args);
        if ( response!=null && response.length()>0 ) {
          return Double.parseDouble(response);
        }
        System.out.println("A number is required.");
      } catch (NumberFormatException e) {
        System.out.println("\""+response+"\" cannot be interpreted as a number!");
      }
    }
  }

  public static double readDouble(String prompt, double lowerBound, double upperBound) {
    while(true) {
      double result = readDouble(prompt);
      if ( result>=lowerBound && result<=upperBound ) {
        return(result);
      }
      System.out.println("A number between "+lowerBound+" and "+upperBound+" (inclusive) is required.");
    }
  }

  public static boolean readBoolean(String prompt) {
    String response = readString(prompt+" (y/N) : ");
    return response.trim().equalsIgnoreCase("Y");
  }

  public static java.io.Console systemConsole() {
    return theConsole;
  }

}

乾杯。キース。

PS: これは練習すればずっと簡単になります...うまくいきます...ただトラックインを続けてください.

于 2012-11-03T05:38:33.530 に答える