在 Java 中读取键盘输入,单个字符



绝对是初学者。我正在上一门使用 Java 编程的入门课,我已经落后了。教授似乎只是在课堂上"做",并没有真正指导。他还给我们提供了程序的示例,然后分配了比他在课堂上向我们展示的程序复杂得多的程序。

我自己重新开始,一页一页地阅读教科书,果然,许多我最初不理解的东西现在有意义,而以前不起作用的大多数程序现在都有意义。

尽管如此,我还是被困在了名为"阅读键盘输入"的部分,更具体地说,"阅读字符"。本书解释说,Scanner 类没有读取单个字符的方法,因此 nextLine 方法用于从键盘读取字符串,输入单个字母,然后使用 charAt 方法提取字符串的第一个字符。

这本书一步一步地解释了它,所以我将新行添加到一个名为 Payroll.java 的现有程序中,原始程序可以工作,但在打印新行后它不会让我输入任何内容。

import java.util.Scanner;   //Needed for the Scanner class
/**
*  This program demonstrates the Scanner class.
*/
public class Payroll{
public static void main(String[] args){
String name;        //To hold a name
int hours;          //Hours worked
double payRate;     //Hourly pay rate 
double grossPay;    //Gross pay
String input;       //To hold a line of input
char answer;        //To hold a single character
//Create a Scanner object to read input.
Scanner keyboard = new Scanner(System.in);
//Get the user's name.
System.out.print("What is your name? ");
name = keyboard.nextLine();
//Get the number of hours worked this week.
System.out.print("How many hours did you work this week? ");
hours = keyboard.nextInt();
//Get the user's hourly pay rate.
System.out.print("What is your hourly pay rate? ");
payRate = keyboard.nextDouble();
//Calculate the gross pay.
grossPay = hours * payRate;
// Ask the user a question.
System.out.print("Are you having fun? (Y=yes, N=no) ");
input = keyboard.nextLine(); // Get a line of input.
answer = input.charAt(0); // Get the first character.
}
}

我得到的错误是:

线程"main"中的异常 java.lang.StringIndexOutOfBounds异常:字符串>索引超出范围:0 at java.lang.String.charAt(未知来源) at Payroll.main(Payroll.java:39)

只是把

keyboard.nextLine();

grossPay=hours*payRate;

以使用您在 中创建的空白区域

payRate = keyboard.nextDouble();

就像@asettouf说的,简单地使用 next() 就可以正常工作。但是,假设你想使用 nextLine(),它不起作用的原因是因为 nextLine() 在 nextDouble() 之后,它不会"接受"换行符,使 nextLine() 的输入成为换行符(或干脆为空)。这个问题的答案提供了一个更彻底的答案,但只需在尝试获取键盘输入之前调用一个新的 nextLine() 方法就可以了。希望这有帮助。

Java 中的扫描程序以标记处理输入。在任何控制台输入中,标记都用空格分隔。因此,如果来自控制台的输入是hello world那么我们有两个令牌:helloworld

处理数字输入(如nextInt()nextDouble())的方法不处理空格。
next()方法以字符串的形式为您提供下一个输入值。键入整数还是双精度并不重要。
nextLine()方法读取整行并将其作为字符串返回。

因此,在调用 nextDouble() 获取payRate后,您当前在控制台中没有输入,因为双精度值位于行尾。因此,当您调用 nextLine() 时,您会在input变量中获得一个空字符串,因为没有什么要处理的,并且它不会给用户任何输入任何内容的机会。

对空字符串调用charAt()方法会导致错误。

因此,您可以做的是使用next()方法,这将使用户有机会输入输入。

你要找的是类似这个的东西

answer = keyboard.nextLine().toLowerCase().charAt(0);

或者,交替

answer = keyboard.nextLine().toUpperCase().charAt(0);

输入是使用 System.in 的扫描仪对象

Scanner keyboard = new Scanner(System.in);

然后你会得到"下一行",它是每个字符,直到下一个换行符。

answer = keyboard.nextLine()
^

然后,您可以将 a 添加到小写或大写。您想这样做来帮助进行选择(即,想要继续?(是/否))这样,无论大小写如何,如果用户输入 y 或 n,您都会得到相同的结果。

answer = keyboard.nextLine().toLowerCase()
^ Could also be .toUpperCase(), depending on what's needed

然后 charAt(i) 获取字符串中该位置的字符。

answer = keyboard.nextLine().toUpperCase().charAt(0);
^

(字符串实际上只是保存字符数组的对象,所以实际上,你也可以在 .toUpperCase() 之后调用 .toCharArray()[0] 并获得相同的结果)。

answer = keyboard.nextLine().toUpperCase().toCharArray();

可以返回如下所示的数组:

[0] => 'T', [1] => 'E', [2] => 'S', [3] => 'T'

因此,如果需要,对于简写或其他项目,您可以编写这样的东西,它将获取输入,将其转换为大写,将其转换为字符数组,并从所述数组中选择一个元素都在一行中。

answer = keyboard.nextLine().toUpperCase().toCharArray()[3];

将返回数组中的第 3 个字符,以下行将是等效的。

answer = keyboard.nextLine().toUpperCase().charAt(3);

然后,您可以将结果(此时应为一个小写字符,具体取决于您在中间使用的方法)分配给字符变量,以便在循环中使用或您有什么。我知道这个解释有点冗长,但希望这可以防止将来出现一些问题。

试试这个:

answer = keyboard.next().charAt(0);

最新更新