2

我正在尝试创建一个菜单,通过数字系统方法将一组数字打印到屏幕上。当我尝试循环我的菜单时,我收到以下错误:

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不是问题。(与使用其他输入法一样,我可以获得产生正确结果的方法。)

我在文本菜单中经常遇到这个问题。谁能帮我?我认为可能是扫描仪正在接收一个空白字符串并且无法从中解析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 回答