Lac*_*hie 2 java variables methods null instance
我已经尝试查看有关此问题的帖子,但我的代码中仍然遇到此错误的问题.所以在第四行中,我创建了一个名为SongDatabase访问SongDatabase该类的实例变量.但是当我到达线SongDatabase.addNewSong();下时case 1,我得到一个java.lang.NullPointerException:null错误.
接口类:
public class Interface
{
Scanner console = new Scanner(System.in);
private SongDatabase SongDatabase;
public static void main(String[] args) {
Interface intFace = new Interface();
intFace.run();
}
private void run() {
switch (userInput) {
case 1:
SongDatabase.addNewSong();
break;
case 2:
SongDatabase.removeSong();
break;
case 3:
SongDatabase.sortSongs();
break;
default:
System.out.println("Please enter a valid number.");
break;
}
}
Run Code Online (Sandbox Code Playgroud)
SongDatabase类:
public class SongDatabase {
Scanner console = new Scanner(System.in);
private Song song1, song2, song3, song4;
public void addNewSong() {
if (song1 == null) {
song1 = getFromUser();
}
else if (song2 == null) {
song2 = getFromUser();
}
else if (song3 == null) {
song3 = getFromUser();
}
else if (song4 == null) {
song4 = getFromUser();
}
else {
System.out.println("The database is currently full. Please delete a song before adding a new one.");
}
}
Run Code Online (Sandbox Code Playgroud)
我已经通过调试器,我知道实例变量,SongDatabase = null,这可能导致错误?我以前有一条线
SongDatabase SongDatabase = new SongDatabase();
SongDatabase.addNewSong();
Run Code Online (Sandbox Code Playgroud)
相反,但我意识到这是每次创建一个新的SongDatabase对象并擦除我存储在那里的内容所以我不得不改变它.我真的很感激解决方案,因为我不知道,谢谢!
您不应该为您的实例字段赋予与该类相同的名称,因为这会导致变量阴影 - 维基百科说(部分)当在特定范围内声明的变量(决策块,方法或内部类)具有相同的阴影时发生变量阴影 name作为在外部作用域中声明的变量.在标识符(名称而不是变量)的级别上,这称为名称屏蔽.你可以在声明中定义引用
private SongDatabase songDatabase = new SongDatabase();
Run Code Online (Sandbox Code Playgroud)
然后像
private void run() {
switch (userInput) {
case 1:
songDatabase.addNewSong();
break;
case 2:
songDatabase.removeSong();
break;
case 3:
songDatabase.sortSongs();
break;
default:
System.out.println("Please enter a valid number.");
break;
}
}
Run Code Online (Sandbox Code Playgroud)