更新:我根据我得到的一些答案进行了一些更改并且有效。 正确的代码是 -
public class Tsett {
static HashSet<String> names=new HashSet<String>();
static String name="";
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
while(2>1){
String s=input.next();
char choice=s.charAt(0);
switch(choice){
case '1': addname(); break;
case '2': removename(); break;
case '3': displayname(); break;
case '4': System.exit(0); break;
default:System.out.println("Invalid Choice Entered.");
}
}
}
public static void addname(){
Scanner b=new Scanner(System.in);
System.out.println("Enter a name to be added.");
name=b.next();
names.add(name);
}
public static void removename(){
Scanner b=new Scanner(System.in);
System.out.println("Enter a name to be remove.");
name=b.next();
names.remove(name);
}
public static void displayname(){
System.out.println("The names are as follows-");
for(String newname:names)
System.out.println(newname);
}
}
使用关键字'static'解决了这个问题。
我在'names'上为我的菜单驱动程序编写了以下代码。
package tut4;
import java.util.HashSet;
import java.util.Scanner;
public class Tsett {
HashSet<String> names = new HashSet<String>();
public static void main(String[] args) {
while (2 > 1) {
Scanner input = new Scanner(System.in);
String s = input.next();
char choice = s.charAt(0);
switch (choice) {
case '1':
addname();
break;
case '2':
removename();
break;
case '3':
displayname();
break;
case '4':
System.exit(0);
break;
default:
System.out.println("Invalid Choice Entered.");
}
}
}
public static void addname() {
String name = "";
Scanner b = new Scanner(System.in);
System.out.println("Enter a name to be added.");
name = b.next();
names.add(name);
}
public static void removename() {
String name = "";
Scanner b = new Scanner(System.in);
System.out.println("Enter a name to be remove.");
name = b.next();
names.remove(name);
}
public static void displayname() {
System.out.println("The names are as follows-");
for (String newname : names) {
System.out.println(newname);
}
}
}
出现的问题是
无法对非静态字段“名称”进行静态引用
在addname()
,removename()
,displayname()
个函数中。
任何人都可以向我解释为什么会出现这种错误以及如何修复它?
答案 0 :(得分:4)
习惯不依赖static
引用。他们有地方和用途,但许多人变得依赖他们。您还应该习惯使用main
方法仅将程序初始化为可以将操作切换到应用程序的主/核类的状态。
相反,我会在你的方法上删除你static
修饰符并创建一个可以&#34;运行&#34;你班级的核心逻辑。
在main
方法中,我将创建Tsett
类的实例并调用此方法。这样您就可以访问实例字段names
和方法
答案 1 :(得分:2)
将names
的声明更改为
static HashSet<String> names = new HashSet<String>();
因为这些方法是静态的,所以它们引用的变量也必须是静态的 这是因为非静态变量必须存在于特定实例中,并且实例之间可以不同,而静态方法则不能。如果要求他们引用非静态变量,则无法知道要使用的类的哪个实例。
答案 2 :(得分:2)
您应该创建这些方法所在类的实例。
String names;
Class class = new Class(); //Creating Instance of "Class" called "class".
names = class.addname(); //Access a method in "Class" using instance name "class" then method name and assign the value it returns to "names".
使用想要显示的名称
Switch(choice){
case '1': names; break;
答案 3 :(得分:1)
要解决您的问题,您需要输入字段&#39;名称&#39;静态的。您获得的错误是尝试在静态上下文中调用非静态字段的结果。
尝试
private static HashSet<String> names = new HashSet<String>();
这将解决您的问题。
答案 4 :(得分:0)
嗯,这里有一些建议(你在上次评论中提到了这些建议......)
while (2 > 1)
更改为while(true)
。将Scanner input = new Scanner(System.in);
放在班级。
放置声明: String s = input.next(); char choice = s.charAt(0); 在循环之外。
在所有方法中都不需要Scanner b = new Scanner(System.in);
。