traducir sale porque pointer catch java variables methods null instance

java - sale - nullpointerexception processing



NullPointerException(Java) (4)

No debe dar al campo de su instancia el mismo nombre que la clase porque causa sombreado variable . Wikipedia dice (en parte) que el sombreado variable ocurre cuando una variable declarada dentro de un cierto alcance (bloque de decisión, método o clase interna) tiene el mismo nombre como una variable declarada en un ámbito externo. En el nivel de los identificadores (nombres, en lugar de variables), esto se conoce como enmascaramiento del nombre . Y podrías definir la referencia en la declaración como

private SongDatabase songDatabase = new SongDatabase();

Entonces algo como

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; } }

Esta pregunta ya tiene una respuesta aquí:

He intentado buscar publicaciones sobre este tema, pero sigo teniendo problemas con este error en mi código. Entonces, en la cuarta línea, creo una variable de instancia llamada SongDatabase para acceder a la clase SongDatabase . Pero cuando llego a la línea, SongDatabase.addNewSong(); en el case 1 , obtengo un java.lang.NullPointerException: error nulo.

Clase de interfaz:

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; } }

Clase 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."); } }

He pasado por el depurador y sé que la variable de instancia, SongDatabase = null, ¿cuál es la causa probable del error? Anteriormente tenía una línea

SongDatabase SongDatabase = new SongDatabase(); SongDatabase.addNewSong();

en cambio, me di cuenta de que esto creaba un nuevo objeto SongDatabase cada vez y limpiaba lo que había almacenado allí, así que tuve que cambiarlo. Realmente apreciaría una solución porque no tengo ni idea, ¡gracias!


Para evitar confusiones, nombre sus variables comenzando con una letra minúscula.

private SongDatabase songDatabase;

De esta forma, está claro que cuando escribes songDatabase te refieres a la instancia y cuando escribes SongDatabase te refieres a la clase.

Necesita crear una instancia de la instancia de la clase antes de poder usarla. Parece que ya eres consciente de esto a partir de la pregunta, pero es solo una cuestión de dónde hacerlo. Para una solución rápida, puede crear una instancia en el punto donde declara la variable. Más tarde puedes buscar un mejor diseño. Por lo tanto:

private SongDatabase songDatabase = new SongDatabase();


Es nulo porque nunca se está instanciando. Cree SongDatabase en su método principal para resolver su problema original:

public static void main(String[] args) { Interface intFace = new Interface(); SongDatabase = new SongDatabase(); SongDatabase.addNewSong(); intFace.run(); }


SongDatabase NullPointerException ya que la variable de clase para SongDatabase nunca se ha instanciado. Para inicializar las variables de clase podemos usar el constructor, por favor vea los detalles del código a continuación. Además, para evitar la confusión de nombres, podemos usar esta palabra clave para tener una mejor legibilidad del código.

import java.util.Scanner; public class Interface { private Scanner console; private SongDatabase songDatabase; public Interface() { this.songDatabase = new SongDatabase(); // Initialize the SongDatabase class and . this.console = new Scanner(System.in); // Initialize the console reference with scanner class. } public static void main(String[] args) { Interface intFace = new Interface(); intFace.run(); } private void run() { System.out.println("1. Add Song"); System.out.println("2. Remove Song"); System.out.println("3. Sort Song"); System.out.print("Please Enter Choice: "); int userInput = console.nextInt(); // Get the data from user input switch (userInput) { case 1: this.songDatabase.addNewSong(); break; case 2: this.songDatabase.removeSong(); break; case 3: this.songDatabase.sortSongs(); break; default: System.out.println("Please enter a valid number."); break; } } }