为什么我的程序无法访问Java中的数学方法?

9

我是第一次学习Java。我写了一个简单的程序:

public class Solver {
    public static void main(String[] args) {
        double angle = 1.5;
        double height = Math.sin(angle);
        System.out.print("The sine of " + angle + " is: ");
        System.out.println(height);
    }
}

当我尝试编译这个程序时,终端会报以下错误:
Solver.java:4: cannot access Math
bad class file: ./Math.java
file does not contain class Math
Please remove or make sure it appears in the correct subdirectory of the classpath.
        double height = Math.sin(angle);
                    ^
1 error

为什么我无法访问Math类?


2
类的名称是什么 - 我猜是Solver.java? - xagyg
2个回答

21
如果一个文件被称为Math.java(看起来是这样的),它 必须 包含一个名为Math的类。参考这篇文章。Java正在寻找一个名为./Math.java的文件,但在你的情况下似乎没有包含名为Math的类。
如果您实际上要使用标准的Java Math包,则需要删除项目目录中任何名为Math.java的内容,因为这会与内置的冲突,或者使用完全限定的导入来访问标准包:import java.lang.Math;。通常不需要从java.lang包中导入,但如果有冲突的名称,则重要的是使用完全限定的导入显式地访问它。
实际上,最好养成将所有内容放在命名包中并始终使用完全限定的导入 的习惯。这将节省您很多麻烦。

3
“Solver.java:4: 无法访问Math”似乎表明文件名为Solver.java。 - Chris Forrence
4
是的,但他的问题似乎出在 Math.java 文件中:bad class file: ./Math.java file does not contain class Math - Henry Keiter
2
啊,所以这个文件名是Solver.java,但是在这个目录中还存在另一个名为Math.java的文件。很酷。取消了踩,加了赞。 - Chris Forrence
谢谢,这个解决了。我最初使用一个名为Math.java的文件,但后来意识到那不行。我创建了一个新文件,但将旧文件留在了目录中。我没有意识到编译器会接受它而不是.class文件。 - Raiden Worley
1
@RaidenWorley 很高兴能帮忙。关于你提到的另一点,编译是将 .java(源)文件转换为 .class 文件的过程。 - Henry Keiter

15

删除文件Math.java,该文件可能会无意中留在您的源代码目录中。此文件会阻止JDK的java.lang.Math类的正常使用。

您还应注意,将类定义为默认包(即不指定包名)是不良做法,这会在日后给您带来各种问题。请将源代码放入命名包中。


+1 - 正确无误;仅因“将您的源代码放入命名包中”而点赞 - duffymo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接