我是java的新手,我在骰子程序中遇到了另一个错误。
在这个程序中我有三个方法,roll()来滚动die并返回一个介于1和用户指定的数字之间的值,getFaceValue(),以将int掷骰的值作为int和toString返回(),将模具卷作为字符串返回。
我之前关于我的程序的问题的答案使我能够使该程序正常工作,但它没有像教授想要的那样构建,所以我不得不重做它。我现在知道我的方法/变量都不是静态的,我只能在程序的主要部分接受用户输入。
当我尝试编译时,出现以下错误:
Die.java:12: error: cannot find symbol
double y = (x * sides) + 1;
symbol: variable sides
location: class Die
我的代码如下:
import java.io.*;
import java.util.*;
public class Die {
//private int sides;
private int z;
private String faceName;
//sets (and returns) the face value to a uniform random number between 1 and the number of faces.
public int roll() {
double x = Math.random();
double y = (x * sides) + 1;
z = (int)y;
return z;
}
//returns the current face value of the die.
public int getFaceValue() {
int face = z;
return face;
}
//returns the string representation of the face value.
public String toString() {
faceName = Integer.toString(z);
return faceName;
}
public static void main(String [] args) {
int sides;
System.out.println("How many sides will the die have?");
Scanner keyboard = new Scanner(System.in);
sides = keyboard.nextInt();
System.out.println(" ");
Die die = new Die();
System.out.println("Roll: " + die.roll());
System.out.println("Face: " + die.getFaceValue());
System.out.println("String: " + die.toString());
}
}
最初,我将变量边作为私有int(你可以在我的程序中看到它被注释掉),但这会产生静态引用错误。
感谢您提供的任何帮助。
答案 0 :(得分:1)
您可以为sides
创建一个实例变量,并通过构造函数将其传递给die。这需要您取消注释private int sides
变量。
示例Die构造函数:
public Die(int sides) {
this.sides = sides;
}
使用这样的构造函数,您可以使用您读取的边数来实例化Die。
sides = keyboard.nextInt();
Die die = new Die(sides);
现在,你的骰子sides
字段被设置为用户输入的内容,而骰子的方法也相应地使用该值。
答案 1 :(得分:0)
您尚未在sides
public int roll() {
在main中创建变量会将其范围缩小到仅在main内 - 除非将其作为变量传递(将通过值传递)或使其成为类变量(字段),否则不能访问其外部
作为骰子,你想让它成为实际课堂上的一个领域。因此,在课程顶部定义边:
public class Die {
int sides;
并在构造函数中指定它:
public Die(int s) {
sides = s;
}
然后当你致电roll
时,你的双边变量将可用。
答案 2 :(得分:0)
你的变量边是未定义的 你可以通过像这样的值传递
public int roll(int sides) {
.....
double y = (x * sides) + 1;
.....
}
答案 3 :(得分:0)
将 sides 作为参数传递给roll方法。
import java.io.*;
import java.util.*;
public class Die {
//private int sides;
private int z;
private String faceName;
//sets (and returns) the face value to a uniform random number between 1 and the number of faces.
public int roll(int sides) {
double x = Math.random();
double y = (x * sides) + 1;
z = (int)y;
return z;
}
public static void main(String [] args) {
int sides;
System.out.println("How many sides will the die have?");
Scanner keyboard = new Scanner(System.in);
sides = keyboard.nextInt();
System.out.println(" ");
Die die = new Die();
System.out.println("Roll: " + die.roll(sides)); // pass it as an argument to roll
System.out.println("Face: " + die.getFaceValue());
System.out.println("String: " + die.toString());
}
}
答案 4 :(得分:0)
您遇到的问题是sides
是main()
方法的本地方法,并且不会以任何方式传递给roll()
方法。当编译器正在编译roll()
时,它会看到double y = (x * sides) + 1;
并且不知道sides
引用了什么 - 因此错误。
有两种方法可以实现此目的,但您应该找到一种方法将您从main()
用户收集的输入传递到Die
课程。一种方法是在Die类的构造函数中:
public static void main(String [] args) {
int sides = keyboard.nextInt();
...
Die die = new Die(sides);
然后,您将Die
类更改为具有接受int
的构造函数,并在名为sides
的成员字段中跟踪它(尽管main()
方法和Die
类中的变量名称实际上不需要相同,这只是一种便利。
public class Die {
private int sides;
public Die(int sides) {
this.sides = sides;
}
public int roll() {
...
double y = (x * this.sides) + 1;