O que causa “Não é possível encontrar o símbolo” e como corrigi-lo?

Eu tenho tentado descobrir isso, eu corri em programas diferentes, então é definitivamente no código. Provavelmente algo fácil também. O erro diz

Password2.java:90: erro: não é possível encontrar o símbolo if (pw.equals (password)) ^ símbolo: variável password localização: class Password2.EnterButtonHandler 1 error

Aqui está o código:

// Password1.java import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class Password2 extends JFrame // inherits from the JFrame class { // static final variables to hold frame dimensions (in pixels) private static final int WIDTH = 400; private static final int HEIGHT = 120; //declare labels, fields, buttons, etc. private JLabel enterLabel, validLabel, resultLabel; private JTextField pwTextField; private JButton enterB, clearB; private EnterButtonHandler ebHandler; private ClearButtonHandler cbHandler; public Password2() // constructor defines frame { setTitle( "Password Checker" ); // set the title of the frame setSize( WIDTH, HEIGHT ); // set the frame size // prepare the container Container pane = getContentPane(); GridLayout aGrid = new GridLayout( 3, 2, 5, 5 ); // create a 3 row 2 column layout pane.setLayout( aGrid ); // set the layout for the frame String password = "hello"; //instantiate JLabels enterLabel = new JLabel("Enter Password: "); validLabel = new JLabel("Validation: "); resultLabel = new JLabel(""); //instantiate text fields pwTextField = new JPasswordField( 30 ); //instantiate buttons enterB = new JButton("Enter"); clearB = new JButton("Clear"); //initialize button handler ebHandler = new EnterButtonHandler(); enterB.addActionListener(ebHandler); //initialize button handler cbHandler = new ClearButtonHandler(); clearB.addActionListener(cbHandler); pane.add(enterLabel); pane.add(pwTextField); pane.add(validLabel); pane.add(resultLabel); pane.add(enterB); pane.add(clearB); //calls center frame method centerFrame( WIDTH, HEIGHT ); }// end constructor //methood to center GUI on screen public void centerFrame( int frameWidth, int frameHeight) { //create toolkit object Toolkit aToolkit = Toolkit.getDefaultToolkit(); //create a dimension object with user screen information Dimension screen = aToolkit.getScreenSize(); //assign x, y position of upper left corner of frame int xUpperLeft = ( screen.width - frameWidth ) / 2; int yUpperLeft = ( screen.height - frameHeight ) / 2; //method to position frame on user's screen setBounds( xUpperLeft, yUpperLeft, frameWidth, frameHeight ); } private class EnterButtonHandler implements ActionListener { public void actionPerformed(ActionEvent e) { String pw = pwTextField.getText(); if(pw.equals(password)) { resultLabel.setText("Password Accepted"); pwTextField.setText(""); } else { resultLabel.setText("Password Rejected"); pwTextField.setText(""); } } } private class ClearButtonHandler implements ActionListener { public void actionPerformed(ActionEvent e) { resultLabel.setText(""); pwTextField.setText(""); } } public static void main(String [] args) { JFrame aPassword2 = new Password2(); // create the JFrame object aPassword2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); aPassword2.setVisible(true); } } // end of class 

Leia a mensagem de erro, adoro a mensagem de erro.

É preciso um pouco de prática, mas depois de um tempo é fácil vê-lo com mais clareza: basta ler o texto em negrito abaixo como uma frase 🙂

erro: não consegue encontrar o símbolo […]

símbolo: senha variável

location: [in] class Password2. EnterButtonHandler

Não há nada nomeada password nesse escopo / contexto ( EnterButtonHandler ).

Codificação feliz.


Dica: existe uma variável local com o mesmo nome em um escopo / contexto diferente … talvez não deva ser uma variável local ? Veja The Java Tutorial: Variables para mais 🙂

password é local para o construtor Password2 .

Ele deve ser passado ou uma variável de instância.

Sua turma não tem uma definição de password . Daí, o erro ao passar para o método equals .

Não é possível encontrar a variável password , que, como você a codificou, existe apenas no construtor Password2 . Você precisará tornar a password uma variável de membro de class ou passá-la para o construtor de suas classs Handler , para que elas possam ter uma referência a ela.

 password 

é uma variável local declarada no construtor de Password2. Não está no escopo do seu EnterButtonHandler.actionPerformed method . Torne uma variável de instância para resolver.