我不知道为什么我会继续在我的代码中告诉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();
}
}
}
答案 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; interface
,class
,或enum
&#34;它提到---所以遇到以import
开头的行是&#34;意外&#34;,意思是不允许。
您可以通过注释掉第二个import
(第22行)并进行编译来验证这一点。你仍会遇到错误,但会有不同的错误。
顺便说一下, 允许{/ 1>}不止一次。多余的陈述将被忽略......只要它们在正确的位置。您可以通过将第二个import java.util.*;
移动到第3行或第4行并进行编译来验证这一点。再说一遍,你仍然会得到错误,但不是这样。
单个import
文件(在语言规范中称为&#34;编译单元&#34;)有以下三个部分,必须按此顺序出现:
.java
声明。package
语句。import
,class
或enum
。从Java 1.8语言规范,Section 7.3: "Compilation Units"]:
interface
是Java程序的语法语法(§2.1)的目标符号(§2.3)。它由以下作品定义:
CompilationUnit
: [PackageDeclaration
] {ImportDeclaration
} {TypeDeclaration
}编译单元由三部分组成,每部分都是可选的[...]
如果最后一个短语让你想知道:是的,一个完全空的CompilationUnit
文件将编译而不会发出警告......并且不会生成任何.java
个文件。
正如其他人所指出的,您不能在单个文件中拥有多个顶级.class
类或其他类型声明。除非您愿意将public
和Calc
中的一个嵌套在另一个内,否则他们必须分成NumCalc
和Calc.java
。
实际上,你可以通过降低一个类对package-default的可见性来回避这个问题,但这很脆弱,而不是Java通常完成的方式。如果你试图在任何其他NumCalc.java
文件中使用package-default类,即使是同一个包中的一个,它也无法编译,因为它无法找到所谓的包可见类--- .java
将在错误命名的Calc
( not ,编译器将在其中查找),或NumCalc.java
将隐藏在{{1}内}}
但为什么还要为此烦恼呢?您可以非常轻松地将这两个类组合成一个类,并拥有一个更连贯的项目。 (我不确定为什么他们首先将课程分开。)