2

numbersystem メソッドを使用して、一連の数字を画面に出力するメニューを作成しようとしています。メニューをループしようとすると、次のエラーが発生します。

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
    at java.lang.String.charAt(Unknown Source)
    at homework4_5.Driver.engageDriver(Driver.java:31)
    at homework4_5.Driver.engageDriver(Driver.java:47)
    at homework4_5.Driver.main(Driver.java:18)

また、私の方法NumberSystemは問題ではないと信じています。(他の入力メソッドを使用する場合と同様に、適切な結果を生成するメソッドを取得できます。)

テキストメニューでこの問題に何度も遭遇しました。誰でも私を助けることができますか?スキャナーが空白の文字列を受信して​​いて、そこから a を解析できない可能性があると思いますint

import java.util.Scanner;

public class Driver {
    Scanner sc = new Scanner (System.in);

    public int baseCount = 0;
    public int numOfCols = 0;
    public boolean loop = true;


    public static void main(String[] args){
        Driver driver = new Driver();
        driver.engageDriver();          
    }


    public void engageDriver(){
        NumberSystem ns = new NumberSystem();
        System.out.println("Hello, please enter the numeric value corresponding to your counting/base system" );
        String temp = sc.nextLine();

        if(temp.charAt(0)== 'q'){
            System.out.println("Shutting Down the program...Thank You!");               
            loop = false;
            return;
        }
        baseCount = Integer.parseInt(temp);             

        System.out.println("Now enter how many columns you would like to display ( a value from 1 to 3 ) ");
        numOfCols=sc.nextInt();
        System.out.println("The number table you requested is:\n ");

        ns.printNumberSystem(baseCount, numOfCols);
        if(loop){
           engageDriver();
        }    
    }
}
4

3 に答える 3

2

tempスタックトレースから、呼び出されたときに空であることを明確にしcharAtます。Stringこのメソッドを呼び出す前に、 にコンテンツがあることを確認してください

if (!temp.isEmpty() && temp.charAt(0) == 'q') {

主な問題は、Scanner#nextInt改行文字を消費しないことです。InputStreamしたがって、これらの文字を消費して、再帰呼び出しでこれらの文字が返されないようにする必要があります。engageDriver

numOfCols = sc.nextInt();
sc.nextLine();
于 2013-10-14T14:05:06.740 に答える
0

例外を使用します。ユーザーが文字列を入力しないと、例外がスローされます。例外をキャッチできます。

try{
     if(temp.charAt(0)== 'q'){
            System.out.println("Shutting Down the program...Thank You!");

            loop = false;
            return;
     }
} catch(StringIndexOutOfBoundsException e) {
     //do whatever you want with it
     System.exit(-1);
}
于 2013-10-14T14:13:00.520 に答える
0

呼び出しnextInt()ても行は変わりません。したがって、次の の呼び出しはnextLine()、行の残りを読み取ります。あなたの場合、次の""ようなものを書き込もうとする12 qと、プログラムが終了します。sc.nextLine()afterを呼び出して読み取り行を強制的に変更する必要があることを修正するにはsc.nextInt()

于 2013-10-14T14:20:15.100 に答える