声明不起作用

时间:2013-10-15 00:43:15

标签: java for-loop

嘿,我是编程新手,正在用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的一个实例”。帮助将不胜感激。

5 个答案:

答案 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);
}