错误.java:23:错误:类,接口或枚举预期导入java.util。*;

时间:2015-09-12 19:32:37

标签: java

我不知道为什么我会继续在我的代码中告诉java22的错误。 我像周围一样搜索了其他人的问题。像这儿 Compiler error: "class, interface, or enum expected"

但我找不到合适的答案。 似乎错误不仅是类,接口或枚举导入部分。一些措辞有问题。 但是如果是这样我想知道,在这种情况下哪个部分是问题的过程?

此外,我想知道如果我想禁用使用num2 for case2。因为它是阶乘的,所以它应该只询问num1。

感谢您的帮助。

这是消息

Calc.java:22: error: class, interface, or enum expected
import java.util.*;
^
1 error

这是代码部分

import java.util.*;
public class Calc
{
public static void main(String[] args)
{
    NumCalc calc = new NumCalc();
    System.out.println("Welcome to Math NumCalc!\nPlease choose an option:" 
    + "\n\t1 " + "- add two real numbers" 
    + "\n\t2 " + "- subtract two real numbers"
    + "\n\t3 " + "- multiply two real numbers"
    + "\n\t4 " + "- devide two real numbers"
    + "\n\t5 " + "- get the factorial of an number"
    + "\n\t6 " + "- menu"
    + "\n\t0 " + "- exit"
    );
    calc.run();
}
}

import java.util.*;
public class NumCalc 
{
private int option = -1;
private Scanner scan, num1, num2;
//private int opt;
double ans  = 0.0;
//int category;

public NumCalc()
{
    scan = new Scanner(System.in); 
}

// entry point for class
public void run()
{
    System.out.println("\n? " + scan);
    int scan = scan.nextInt();

    for (int i=0;i < count; i++)
    {
        option = option + scan.nextInt(); 
    }

    System.out.println("Enter 1st num:");
    int num1 = scan.nextInt();
    System.out.println("Enter 2nd num");
    int num2 = scan.nextInt();

    switch (option)
    {
        case 6:
        ans = num1 + num2;
        System.out.println(num1 + " + " + num2 + "=" + ans);
        break;
        case 5:
        ans = num1 - num2;
        System.out.println(num1 + " - " + num2 + "=" + ans); 
        break;
        case 4:
        ans = num1 * num2;
        System.out.println(num1 + " * " + num2 + "=" + ans);
        break;            
        case 3:
        ans = num1 / num2;
        System.out.println(num1 + " / " + num2 + "=" + ans);
        break;
        case 2:
        num2 = boolean(false); // No 2nd number.
        int ans = 1; 
        for (i = 1;i <= n; i++)
        {
            ans *= n;
        }
        break;
        System.out.println("Factorial of" + num1 + " = ");
        case 1:
        //opt = opt + scan.nextInt();
        continue;
        default:
        close();
    }
}
}

1 个答案:

答案 0 :(得分:1)

正如其他人所说,简单的解决方案是将两个public类拆分为两个单独的.java文件。这将解决您已经遇到的错误以及您稍后将遇到的另一个错误......但是&#34;太多的公共课程&#34;是您的Java编译器抱怨的是什么。您收到该错误的真正原因是您无法在import声明之后发出class个语句。

错误信息很容易被误读。它似乎在抱怨你正在导入什么 - 可能会引发响应,例如,#34;但我导入一个类!&#34 ;。但请注意^指向的位置---不是java.util.*,而是import

Calc.java:22: error: class, interface, or enum expected
    import java.util.*;
    ^
1 error

这个错误实际上是抱怨不合时宜的import声明 - 它根本不应该存在。一旦您宣布了第一个class,那么import其他任何内容都为时已晚。以迂回的方式,它实际上是这样说的:在Calc.java的第22行,顶层没有任何东西可以出现,但是类型声明---&#34; interfaceclass,或enum&#34;它提到---所以遇到以import开头的行是&#34;意外&#34;,意思是不允许。

您可以通过注释掉第二个import(第22行)并进行编译来验证这一点。你仍会遇到错误,但会有不同的错误。

顺便说一下, 允许{/ 1>}不止一次。多余的陈述将被忽略......只要它们在正确的位置。您可以通过将第二个import java.util.*;移动到第3行或第4行并进行编译来验证这一点。再说一遍,你仍然会得到错误,但不是这样。

正确的命令

单个import文件(在语言规范中称为&#34;编译单元&#34;)有以下三个部分,必须按此顺序出现:

  1. 零或一个.java声明。
  2. 零个或多个package语句。
  3. 零个或多个顶级类型声明,例如importclassenum
  4. 从Java 1.8语言规范,Section 7.3: "Compilation Units"]:

      

    interface是Java程序的语法语法(§2.1)的目标符号(§2.3)。它由以下作品定义:

         
        

    CompilationUnit:     [PackageDeclaration] {ImportDeclaration} {TypeDeclaration}

      
         

    编译单元由三部分组成,每部分都是可选的[...]

    如果最后一个短语让你想知道:是的,一个完全空的CompilationUnit文件编译而不会发出警告......并且不会生成任何.java个文件。

    解决方案

    正如其他人所指出的,您不能在单个文件中拥有多个顶级.class类或其他类型声明。除非您愿意将publicCalc中的一个嵌套在另一个内,否则他们必须分成NumCalcCalc.java

    实际上,你可以通过降低一个类对package-default的可见性来回避这个问题,但这很脆弱,而不是Java通常完成的方式。如果你试图在任何其他NumCalc.java文件中使用package-default类,即使是同一个包中的一个,它也无法编译,因为它无法找到所谓的包可见类--- .java将在错误命名的Calc not ,编译器将在其中查找),或NumCalc.java将隐藏在{{1}内}}

    但为什么还要为此烦恼呢?您可以非常轻松地将这两个类组合成一个类,并拥有一个更连贯的项目。 (我不确定为什么他们首先将课程分开。)