javac错误:仅在显式请求注释处理的情况下,才接受类名称


112

编译Java程序时出现此错误:

error: Class names, 'EnumDevices', are only accepted if annotation 
processing is explicitly requested
1 error

这是Java代码(我正在Ubuntu上运行它)。

import jcuda.CUDA;    
import jcuda.driver.CUdevprop;    
import jcuda.driver.types.CUdevice;

public class EnumDevices {

  public static void main(String args[]) {
     CUDA cuda = new CUDA(true);    
        int count = cuda.getDeviceCount();

        System.out.println("Total number of devices: " + count);

        for (int i = 0; i < count; i++) {

          CUdevice dev = cuda.getDevice(i);
          String name = cuda.getDeviceName(dev);
          System.out.println("Name: " + name);
          int version[] = cuda.getDeviceComputeCapability(dev);

          System.out.println("Version: " + 
              String.format("%d.%d", version[0], version[1]));
          CUdevprop prop = cuda.getDeviceProperties(dev);
          System.out.println("Clock rate: " + prop.clockRate + " MHz");
          System.out.println("Threads per block: " + prop.maxThreadsPerBlock);
        }
    }
}

这是javac命令:

javac -cp /home/manish.yadav/Desktop/JCuda-All-0.3.2-bin-linux-x86_64 EnumDevices

如何编译该程序?

Answers:


132

您至少需要.java在此行中将扩展名添加到文件名:

javac -cp /home/manish.yadav/Desktop/JCuda-All-0.3.2-bin-linux-x86_64 EnumDevices

来自官方常见问题解答

仅当显式请求注释处理时,才接受类名“ HelloWorldApp”

如果收到此错误,则在编译程序时忘记包含.java后缀。请记住,该命令是javac HelloWorldApp.java而不是javac HelloWorldApp。

另外,在第二个javac示例中(您实际上包括在内.java),您需要包括编译所需的所有必需.jar文件。


1
那也是,但我认为仍然不会产生该特定错误。应该产生了“找不到文件”或类似内容。
jwenting 2011年

我会同意的。尤其是因为这样做很容易出错(因为使用.class进行启动时应将其省略java)。
aioobe

“仅在显式请求注释处理的情况下,才接受类名'HelloWorldApp'”。找不到文件的愚蠢方式。或者错误消息应该指的是什么?我只能找到此修复程序,但找不到错误消息这样写的原因。
masterxilo

1
启用注释处理后,您可以在编译过程中以编程方式生成类。因此,通过注释处理,即使文件不存在,您实际上也可以编译某些内容(即,您可以动态创建丢失的部分)。当然,该错误消息具有误导性。如果我进一步研究,我会尽快与您联系。
aioobe 2014年

19

我也为此感到困惑,因为我包括了.Java扩展名...然后我注意到大写的J。

这也会导致“注释处理”错误:

javac myclass.Java 

相反,它应该是:

javac myclass.java 

6

使用javac ClassName.java编译程序,然后使用java ClassName执行编译后的代码。您不能仅将Javac与ClassName混合使用(不带Java扩展名)。


4

错误“仅在显式请求批注处理的情况下才接受类名”可能是由以下一种或多种原因引起的:

  1. 编译时未对Java文件使用.java扩展名。
  2. 编译时.java扩展名(即.Java)的大小写不正确。
  3. 编译时.java扩展名中的任何其他错字。
  4. 当同时编译和运行时,忘记使用'&&'来连接两个命令(即javac Hangman.java java Hangman)。我花了大约30分钟的时间解决了这个问题,通过分别运行编译和程序运行,我注意到了这一点,这当然工作得很好。

这可能不是导致此错误的完整原因列表,但是到目前为止,这些是我所知道的原因。


3
chandan@cmaster:~/More$ javac New.java
chandan@cmaster:~/More$ javac New
error: Class names, 'New', are only accepted if annotation processing is explicitly requested
1 error

因此,如果您在编译后错误地将其再次javac用于运行程序。


3

我了解到,您也可以通过将源文件存储在名为Java的文件夹中来获取此错误。


2

我认为这也是因为编译不正确。

所以对于linux(ubuntu).....

javac文件.java

Java文件


3
答案应尽量详细说明为什么会首先导致该问题,然后指出解决方案(如果有)
Coder

0

如何在Ubuntu终端上重现此神秘错误:

将其放在一个名为Main.java的文件中:

public Main{
    public static void main(String[] args){
        System.out.println("ok");
    }
}

然后像这样编译它:

user@defiant /home/user $ javac Main
error: Class names, 'Main', are only accepted if 
annotation processing is explicitly requested
1 error

这是因为您没有.java在末尾指定Main

这样做,就可以了:

user@defiant /home/user $ javac Main.java
user@defiant /home/user $

现在拍打你的额头,抱怨该错误消息是如此神秘。


2
你也没有:D!您在两个示例中都编写了不带.java的Main!
freerunner

0

也许您可能正在使用文件名而不是方法名进行编译。...检查一次我也犯了同样的错误,但我很快就纠正了它..#happy Coding


0

首先从https://www.oracle.com/technetwork/java/javase/downloads/index.html下载jdk 。然后在搜索写编辑系统的环境变量在打开的窗口我在系统变量然后推底部称为环境变量在这里输入的形象描述 推下新的在领域的新变量写在像JDK“路径”在领域的新值写入目录中的文件夹仓“ C:\ Program Files \ Java \ jdk1.8.0_191 \ bin“,但在我的操作系统中仅此” C:\ Program Files \ Java \ jdk1.8.0_191 \ bin \ javac.exe“ 在此处输入图片描述, 按OK 3次

启动Cmd。我推下Windows +R。然后输入cmd。在cmd中写入“ cd(带代码的目录)”看起来像C:\ Users \ user \ IdeaProjects \ app \ src。然后编写“ javac(程序的主类名称).java”,就像blabla.java,而javac在目录中创建字节码((主类名称).class)。最后在cmd“ java(您的主类的名称)”中编写,我的程序开始工作


0

错误:仅在显式请求注释处理时才接受类名

为避免此错误,应使用扩展名为.java的javac命令。

Javac DescendingOrder.java <-完美运行。


0

如果在同一行中编译多个文件,请确保仅对Javac使用一次,而不对每个类文件使用。

不正确: 在此处输入图片说明

正确: 在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.