绝对是初学者。我正在上一门使用 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
那么我们有两个令牌:hello
和world
处理数字输入(如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);