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

时间:2017-03-19 01:38:42

标签: java

绝对的初学者在这里。我正在上一门使用Java进行编程的课程,我已经落伍了。教授似乎只是在课堂上“做”而不是真正指导。他还向我们提供了程序示例,然后分配的程序远比他在课堂上向我们展示的程序复杂得多。

我自己重新开始并逐页阅读教科书,果然,我最初没有理解的许多事情现在都有意义,而且大多数之前无法工作的程序都可以。

然而,我被困在“阅读键盘输入”这一部分,更具体地说是“读一个角色”。本书解释了Scanner类没有读取单个字符的方法,因此nextLine方法用于从键盘读取字符串,输入单个字母,然后charAt方法用于提取第一个字符字符串。

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

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.StringIndexOutOfBoundsException:String> index超出范围:0           在java.lang.String.charAt(未知来源)           在Payroll.main(Payroll.java:39)

5 个答案:

答案 0 :(得分:0)

就像@asettouf所说的那样,只需使用next()就行了。然而,假设你' D喜欢用nextLine(),它不是,原因'吨工作是因为nextLine()是后一个nextDouble(),它没有按' T"取&#34 ;新行字符,将nextLine()的输入作为新行字符(或简称为空)。 this question的答案提供了更全面的答案,但在尝试获取键盘输入之前简单地调用新的nextLine()方法将起作用。希望这有帮助。

答案 1 :(得分:0)

试试这个:

trait Counter
{
    public static $all = array();
    public static function addToObjects($object)
    {
        if (is_object($object))
        {
            self::$all[] = $object;
        }
    }

}
class CountingClass
{
    use Counter;
}
class MyClass
{
    public function __construct()
    {
        CountingClass::addToObjects($this);
    }
}

$c = new MyClass;
$c = new MyClass;
$c = new MyClass;
$c = new MyClass;

print_r(CountingClass::$all);

答案 2 :(得分:0)

Java中的扫描程序根据令牌处理输入。在任何控制台输入中,令牌由空格分隔。因此,如果来自控制台的输入为Array ( [0] => MyClass Object ( ) [1] => MyClass Object ( ) [2] => MyClass Object ( ) [3] => MyClass Object ( ) ) ,那么我们有两个令牌:answer = keyboard.next().charAt(0); hello world

处理helloworld等数字输入的方法不会处理空格 nextInt()方法以字符串的形式为您提供下一个输入值。无论您是键入整数还是双键都无关紧要 nextDouble()方法读取整行并将其作为字符串返回。

因此,在调用nextDouble()获取next()之后,您当前没有输入控制台,因为double值位于该行的末尾。因此,当您调用nextLine()时,您的nextLine()变量中会出现一个空字符串,因为没有任何内容可以处理,并且它不会给用户任何输入任何内容的机会。

对空字符串调用payRate方法会导致错误。

所以,你可以做的是使用input方法,让用户有机会输入输入。

答案 3 :(得分:0)

您正在寻找的内容与此相似。

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

或者,或者

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

输入是您使用System.in

的扫描仪对象
Scanner keyboard = new Scanner(System.in);

然后你得到"下一行"这是每个角色直到下一个换行符。

answer = keyboard.nextLine()
                  ^

然后您可以添加到小写或大写。你想这样做是为了帮助选择(I.E.,想继续?(y / n))这样无论如何,如果用户输入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);

然后你可以将结果(在这一点上应该是一个大写或小写字符,取决于你在中间使用的方法)分配给一个字符变量,用于循环或者你有什么。我知道这个解释有点冗长,但希望这可以防止你将来遇到一些问题。

答案 4 :(得分:0)

刚刚放

keyboard.nextLine();
grossPay=hours*payRate;

之后

使用您在

创建的空白空间
payRate = keyboard.nextDouble();