绝对的初学者在这里。我正在上一门使用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)
答案 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
处理hello
或world
等数字输入的方法不会处理空格
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();