Java类没有正确交互

时间:2010-10-28 16:56:51

标签: java class classpath

我有两个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;
    }

}

5 个答案:

答案 0 :(得分:2)

检查你的类路径 - 它有“。”在里面?如果不是,不,Java不会在当前目录中查找类。

不,Java并不关心所有小写的类名(假设它们 始终 小写,无论是在使用的位置还是在定义的位置), 约定是类具有大写第一个字符(通常是camelCase),例如PrimeGenPrimeCheckprimegenprimecheck。它与您的问题无关,但它往往会使人们惊讶并混淆查看代码的人(就像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类的位置非常重要(指示编译器可以找到类的源代码的位置。)

<强>参考

  1. The javac tech notes.
  2. Setting the classpath for javac

答案 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