我尝试查看有关此问题的帖子,但是我的代码在此错误上仍然遇到一些麻烦。因此,在第四行中,我创建了一个实例变量,称为SongDatabase访问SongDatabase该类。但是,当我坐下来行,SongDatabase.addNewSong();下case 1,我得到一个显示java.lang.NullPointerException:零误差。
SongDatabase
SongDatabase.addNewSong();
case 1
接口类:
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; } }
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."); } }
我已经调试了整个调试器,并且知道实例变量SongDatabase = null,这可能是导致错误的原因吗?我以前有一条线
SongDatabase SongDatabase = new SongDatabase(); SongDatabase.addNewSong();
相反,但是我意识到这是每次都创建一个新的SongDatabase对象,并擦除我在那里存储的内容,因此我不得不对其进行更改。我真的很感谢一个解决方案,因为我不知道,谢谢!
您不应为实例字段提供与类相同的名称,因为这会导致变量阴影 -维基百科说,(部分) 变量阴影 是在一定范围内(决策块,方法或内部类)声明的变量相同时发生的。名称作为在外部作用域中声明的变量。在标识符(名称,而不是变量)级别,这称为名称掩码。您可以在声明时定义引用,例如
private SongDatabase songDatabase = new SongDatabase();
然后像
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; } }