Java 扫描仪阅读前导 Space

Java Scanner Reading Leading Space

我正在尝试创建一个菜单,该菜单接受 switch case 的字符输入并循环直到输入为 q 但在循环之后 运行 一旦出现此错误:

线程“main”中的异常 java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:0 在 java.lang.String.charAt(未知来源)在 Menu.main(Menu.java:19)

这意味着它得到了一个空输入吗?所以我添加了 .trim() 但我仍然收到错误,它甚至不等待输入我只是收到错误。

抱歉,如果之前已经回答过这个问题,但我无法在任何地方找到它。我也试过添加 keyboard.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");这也不起作用。

为带有错误日志的程序提供的输入:

Enter Option (a,b,c,d,e,f,q):

c

Enter 2 Numbers

First Number:

1

Second Number:

10

1, 2, 3, 4, 5,
6, 7, 8, 9, 10

Enter Option (a,b,c,d,e,f,q):

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

代码:

import java.io.*;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

    Scanner keyboard = new Scanner (System.in);
    char ch; int m,n; String y;
    do
    {
        System.out.println("Enter Option (a,b,c,d,e,f,q):");
        ch = keyboard.nextLine().toLowerCase().charAt(0);
        switch (ch)
        {
        case 'c':
            
            System.out.println("Enter 2 Numbers");
            System.out.println("First Number: ");
            m = keyboard.nextInt();
            System.out.println("Second Number: ");
            n = keyboard.nextInt(); 
            for(int i = 1; i <= n - m + 1; i++)
            {
                if (i % 5 == 0)
                {
                    System.out.print(i);
                    if (i != n - m + 1)
                    {
                    System.out.println(", ");
                    }
                }else
                {
                    System.out.print(i);
                    if (i != n - m + 1)
                    {
                    System.out.print(", ");
                    }
                }
                
            }
            System.out.println("");
            break;
        }
    }while (ch != 'q');

}
 
} 

这是更新后的代码请检查:

public static void main(String[] args)
{
    

    Scanner keyboard = new Scanner (System.in);
    char ch;
    do
    {
        System.out.println("Enter Option (a,b,c,d,e,f,q):");
        ch = keyboard.nextLine().toLowerCase().charAt(0);   
        switch (ch)
        {
        //case statements for a,b,c,d,e and f
        }
    }while (ch != 'q');

}

这里的主要内容是扫描仪在您点击“输入”后立即处理输入。 因此,如果您的输入要在第 19 行输入 '\u0020'(whitespaces) 甚至多次,那么根据 javadoc charAt.

,您正在对空行执行 trim

尝试行 ch = keyboard.next().charAt(0);开关(声道)

import java.io.*;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

    Scanner keyboard = new Scanner (System.in);
    char ch; int m,n; String y;
    do
    {
        System.out.println("Enter Option (a,b,c,d,e,f,q):");
        ch = keyboard.next().charAt(0);

        switch (ch)
        {
        case 'c':
            
            System.out.println("Enter 2 Numbers");
            System.out.println("First Number: ");
            m = keyboard.nextInt();
            System.out.println("Second Number: ");
            n = keyboard.nextInt(); 
            for(int i = 1; i <= n - m + 1; i++)
            {
                if (i % 5 == 0)
                {
                    System.out.print(i);
                    if (i != n - m + 1)
                    {
                    System.out.println(", ");
                    }
                }else
                {
                    System.out.print(i);
                    if (i != n - m + 1)
                    {
                    System.out.print(", ");
                    }
                }
                
            }
            System.out.println("");
            break;
        }
    }while (ch != 'q');

}
 
} 

编码愉快!