我有两个Java类文件: primegen 和 primecheck 位于同一目录中。 primegen 从 primecheck 调用公共静态函数。 primecheck 编译得很好。
但是,我在 primegen 中收到以下编译错误:
primegen.java:31: cannot find symbol
symbol : variable primecheck
location: class primegen
} while (!primecheck.prime(primeCandidate));
^
Java不应该检查同一目录中的其他(已编译)类吗? Java是否存在 primecheck 是小写字母的问题(例如,它是否将 primecheck 视为变量而不是类?)?
使用完整代码进行更新
primegen代码:
import java.math.BigInteger;
import java.util.Random;
public class primegen
{
public static void main(String args[])
{
try
{
int numBits = Integer.parseInt(args[0].trim());
System.out.println(generatePrime(numBits));
}
catch (Exception e)
{
System.out.println("You must enter a positive integer number of bits.");
}
}
private static BigInteger generatePrime(int numBits) throws Exception
{
if (numBits < 1)
throw new Exception("You must enter a positive integer number of bits.");
BigInteger primeCandidate;
Random rand = new Random();
do
{
primeCandidate = new BigInteger(numBits, rand);
} while (!primecheck.prime(primeCandidate));
return primeCandidate;
}
}
Primecheck代码:
import java.math.BigInteger;
import java.util.Random;
public class primecheck
{
public static void main(String args[])
{
try
{
BigInteger primeCandidate = new BigInteger(args[0].trim());
if (prime(primeCandidate))
System.out.println("True");
else
System.out.println("False");
}
catch (Exception e)
{
System.out.println("You must enter a positive integer.");
}
}
public static boolean prime(BigInteger n) throws Exception
{
if (n.compareTo(BigInteger.ZERO) == -1)
throw new Exception("You must enter a positive integer.");
else if (n.equals(BigInteger.ZERO) || n.equals(BigInteger.ONE))
return false;
int maxIterations = 1000;
BigInteger a;
for (int i = 0; i < maxIterations; i++)
{
a = randomBase(n);
a = a.modPow(n.subtract(BigInteger.ONE), n);
if (!a.equals(BigInteger.ONE))
return false;
}
return true;
}
private static BigInteger randomBase(BigInteger n)
{
Random rand = new Random();
BigInteger a;
do
{
a = new BigInteger(n.bitLength(), rand);
} while ( !(BigInteger.ONE.compareTo(a) <= 0 && a.compareTo(n) < 0) );
return a;
}
}
答案 0 :(得分:2)
检查你的类路径 - 它有“。”在里面?如果不是,不,Java不会在当前目录中查找类。
不,Java并不关心所有小写的类名(假设它们 始终 小写,无论是在使用的位置还是在定义的位置), 但约定是类具有大写第一个字符(通常是camelCase),例如PrimeGen
和PrimeCheck
与primegen
和primecheck
。它与您的问题无关,但它往往会使人们惊讶并混淆查看代码的人(就像SO上的人一样)。 : - )
更新这些类是否在包中?如果是这样,您需要确保它们相对于与路径相关的类路径位于正确的位置。但通常会出现在import
声明中,而不是您使用primecheck
......
答案 1 :(得分:2)
Java并不关心全部小写或大写的名称。这些只是命名约定(Java 区分大小写,但不会强制执行任何特定的命名约定。)
编辑:(经过几次迭代后):
您发布的代码编译得很好。问题显然在其他地方(javac命令行参数,类路径......)
答案 2 :(得分:2)
Java 区分大小写。也许你的班级被定义为PrimeCheck
或类似的东西?
答案 3 :(得分:0)
由于这是编译错误,而不是运行时错误,因此了解编译器primecheck
时编译器无法找到primegen
类非常重要。当编译期间必须解析任何符号时,默认情况下,当前目录(通过推理,当前包)由用户类路径中的javac编译器包含。但是,如果这被CLASSPATH环境变量覆盖,则符号解析将失败。
还有可能(我还没有证实这一点)'。' classpath环境变量中的符号未扩展到当前工作目录中,因此最好明确指定.class文件的位置。
因此,在编译primegen时,通过-classpath
选项(指示可以找到.class文件的位置)或-sourcepath
选项来指定primecheck类的位置非常重要(指示编译器可以找到类的源代码的位置。)
<强>参考强>:
答案 4 :(得分:0)
primegen
课程中似乎存在符号冲突。
在同一范围内声明另一个变量primecheck
会导致编译器对如何处理引用感到困惑 - 引用类或对象的代码是什么?它最终将其视为对象引用,并且由于对象的类没有在其中定义方法prime()
,因此它会引发错误。当然,这个例子也证明了为什么命名约定是一个好主意。
请考虑以下代码段,以及编译primegen
时产生的错误。
Class primegen
import java.math.BigInteger;
import java.util.Random;
public class primegen
{
public static void main(String args[]){}
private static BigInteger generatePrime(int numBits) throws Exception
{
if (numBits < 1)
throw new Exception("You must enter a positive integer number of bits.");
BigInteger primeCandidate;
Random rand = new Random();
String primecheck = "";
do
{
primeCandidate = new BigInteger(numBits, rand);
} while (!primecheck.prime(primeCandidate));
return primeCandidate;
}
}
班级优先检查
import java.math.BigInteger;
public class primecheck
{
public static void main(String args[]){}
private static BigInteger randomBase(BigInteger n){return null;}
public static boolean prime(BigInteger n) throws Exception
{
if (n.compareTo(BigInteger.ZERO) == -1)
throw new Exception("You must enter a positive integer.");
else if (n.equals(BigInteger.ZERO) || n.equals(BigInteger.ONE))
return false;
int maxIterations = 1000;
BigInteger a;
for (int i = 0; i < maxIterations; i++)
{
a = randomBase(n);
a = a.modPow(n.subtract(BigInteger.ONE), n);
if (!a.equals(BigInteger.ONE))
return false;
}
return true;
}
}
产生的错误是:
primegen.java:18: cannot find symbol
symbol : method prime(java.math.BigInteger)
location: class java.lang.String
} while (!primecheck.prime(primeCandidate));
^
1 error