NullPointerException(Java)

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对象并擦除我存储在那里的内容所以我不得不改变它.我真的很感激解决方案,因为我不知道,谢谢!

Ell*_*sch 6

您不应该为您的实例字段赋予与该类相同的名称,因为这会导致变量阴影 - 维基百科说(部分)当在特定范围内声明的变量(决策块,方法或内部类)具有相同的阴影时发生变量阴影 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)