嘿,我是编程新手,正在用eclipse探索Java。我正在尝试制作一个简单的程序,我可以输入骰子有多少边,以及我想要使用多少边。 for语句给我带来了麻烦。
这就是我所拥有的。
{
public static void main(String[] args)
{
Random generator = new Random ();
int sides;
int num;
int rolls;
Scanner scan = new Scanner(System.in);
while (sides != 0);
{
System.out.println("How many sides does your dice have?(0 to quit)");
sides = scan.nextInt();
System.out.println("How many dice would you like to roll?");
rolls = scan.nextInt();
for (int num1 : rolls);
{
num = generator.nextInt(sides);
System.out.println("You rolled a " + num);
}
}
}
}
for语句说当我将鼠标悬停在'roll'上时“它只能迭代一个数组或java.lang.Iterable的一个实例”。帮助将不胜感激。
答案 0 :(得分:2)
Java中的for ( <type> <name> : <collection> )
需要冒号:
右侧的集合。如果您想要查看一系列整数,请使用其他形式的for
:
for (int num1 = 0 ; num1 < rolls ; num1++) {
...
}
答案 1 :(得分:1)
您的程序有Java语法错误,编译器会抱怨, 还有一个更微妙的逻辑错误,即使在有经验的人中也是如此 整个C / C ++ / C#/ Java系列的程序员。
语法错误是您使用的 的类型需要您指定 结肠后的集合;或者,更准确地说,是一种类型的对象 实现接口 Iterable 。接口定义授权的合同 编译器对实现的类的实例执行某些操作 界面。因此,只有在编译时,编译器才会处理对变量的迭代 变量 Iterable 。因为在你的情况下 roll 的类型是 int (因此 甚至不是一个类) int 不是 Iterable ,你得到错误。
你使用经典 对整数进行迭代,这几乎支持 C,C ++,C#和Java没有区别。
for (int num1 = 0; num1 < rolls; num1 = num1 + 1)
/* A single statement (body) */;
此声明表示:重复正文,即后面提到的单声明,正好滚动次。更准确地说,它实现了以下算法:
A. Initialize num1 to 0
B. Is num1 lesser than rolls?
If yes, execute the body, increment num1 and go back to B
If not, go to the first instruction after the **for**
现在,第二个问题;这种情况可能会出现在 for 的两种风格中,但不太可能被 Iterable 风格忽视。您很可能不希望在 for 语句后面加分号;这就是原因。 C和所有具有类C语法的语言(如Java)的设计决策是,在大多数要插入一个或多个语句的地方,实际上只能插入一个语句。 for 循环只能处理其正文中的单个指令,并且它将是)之后的指令,忽略缩进和编码样式。考虑以下两个 for 周期:
// Prints numbers from 0 to 9
int x = 0;
for (x = 0; x < 10; x = x + 1)
System.out.println(x);
// Prints 10
int y = 0;
for (y = 0; y < 10; y = y + 1);
System.out.println(y);
它们看起来很相似,但是第一个代码片段的效果是将数字从0打印到9,而第二个的效果是打印10.原因是第二个for的主体实际上是一个空语句。您可以像这样重写两个* for *:
int x = 0;
for (x = 0; x < 10; x = x + 1)
System.out.println(x);
int y = 0;
for (y = 0; y < 10; y = y + 1)
/* Lalala... does nothing at all... */;
System.out.println(y); // When control flow gets here, y equals 10
要在 中添加多个语句,必须使用块,这是一个由许多语句组成的语句。对初学者来说误导的是,块不必与 for 相关联,实际上可以独立存在。 Java中的以下代码是合法的:
{
num = generator.nextInt(sides);
System.out.println("You rolled a " + num);
}
当您输入 时错误地在结尾包含分号:
for (int num1 = 0; num1 < rolls; num1 = num1 + 1);
{
num = generator.nextInt(sides);
System.out.println("You rolled a " + num);
}
你基本上是在说:
for (int num1 = 0; num1 < rolls; num1 = num1 + 1)
/* Lalala... does nothing at all... */;
{
num = generator.nextInt(sides);
System.out.println("You rolled a " + num);
}
因此你的for正在执行 nothing roll 次,然后执行一次block语句。有时这样的错误可以通过 for 的主体引用迭代变量 num1 这一事实得到缓解,但事实并非如此。考虑:
for (int num1 = 0; num1 < rolls; num1 = num1 + 1);
{
Console.out.println("Roll No. " + num1);
num = generator.nextInt(sides);
System.out.println("You rolled a " + num);
}
这有;问题,但编译器检测到有错误,因为您在块语句中使用 num1 ,但由于;块语句与 for 无关,因此 num1 超出范围。以下虽然具有相同的逻辑错误,但不会导致编译器错误:
for (int num1 = 0; num1 < rolls; num1 = num1 + 1);
{
num = generator.nextInt(sides);
System.out.println("You rolled a " + num);
}
注意:您的 也有类似的额外问题;字符。
答案 2 :(得分:0)
Java中的for
循环传统上采用for (initialization; termination; increment)
的形式。最近(相对)添加了for-each
快捷方式,用于允许更简单地循环Iterable
和数组的实现。
尝试使用....
for (int num1 = 0; num1 < rolls; num1++) {...}
...来代替。
仔细查看The for
statement了解更多详情
答案 3 :(得分:0)
你想要
for (int num1 = 0; num1 < rolls; num1++)
(之后没有分号)。
有两种for循环,基于范围的数组和迭代,以及标准的循环,你给它一个初始化,一个条件是继续运行,以及每个循环后要做的事情。这三个部分用分号分隔,就像我上面那样。
答案 4 :(得分:0)
您遇到的问题是,当您打算使用foreach
循环时,您实际上是在尝试执行for
。当您使用正在使用的表示法时for(T x : Collection<T>)
请注意,您声明了变量int num1
,然后尝试迭代另一个数字rolls
。这只能用于迭代集合而不能用于创建标准循环。相反,您应该使用标准for
循环:
for (int x = 0; x < rolls; x++);
{
num = generator.nextInt(sides);
System.out.println("You rolled a " + num);
}