我是Java的新手,所以我可能在做这件事时完全错了。我必须为软件工程课程做这个庞大的项目。该代码长约2,000行,所以这是基本代码

public class BookRental extends JFrame{
   public Client currentClient = new Client(); // creating client object
   //rest of declared variables.

   public class Client{                        //Client class containing all get/set methods for each variable
   private username;
   private void setUsername(String u){
      username = u;
   }
   public String getUsername(){
      return username;
   }


   public class LoginPanel extends JPanel{}    //Panel to show and receive login info.
   public class RegisterPanel extends JPanel{} //Panel to register.
   public class MenuPanel extends JPanel{      //Panel showing main menu.
      //At this point currentClient will contain values
      public ClientInfoPanel(){
         initComponents();
      }
      private void initComponents(){
         infoPanelUserName = new JLabel();
         infoPanelFullName.setText("Currently logged in as: " + currentClient.getUsername());
      }
      private JLabel infoPanelUserName;
    }
   public class ClientInfoPanel extends JPanel{} //Panel to print currentClient info to screen using JLabel objects

   private void ViewClientInfoButtonActionPerformed(event){  // Using button in Menu Panel to setVisibility of clientInfoPanel to (true)
      //At this point there will be a value for currentClient
      clientInfoPanel = new ClientInfoPanel();
      this.add(clientInfoPanel);
      menuPanel.setVisible(false);
      clientInfoPanel.setVisible(true);
   }
   public BookRental(){initComponents();} //Constructor
   private void initComponents(){}             // Creates all panels and sets visibility off, besides login

   public static void main(String args[]){
       new BookRental().setVisible(true);
   }


}

我已经很确定自己完全错了,但是我的问题是为什么我不能在ClientInfoPanel内部访问currentClient?为这个JLabel说:

infoPanelUserName.setText("Currently logged in as: " + currentClient.getUsername());


ClientInfoPanel识别currentClient存在,并且getUsername()方法存在,但是它打印:


  “当前登录为:”

最佳答案

您显示的代码看起来不错,所以问题出在其他地方,或者该代码不能代表您拥有的代码。另外,您将成功访问currentClient,除非您遇到NullPointerException异常或将其捕获到某个地方,否则.getUsername()调用将得以解决。所以问题实际上出在.getUsername()上,以某种方式在调用.getUsername()时用户名未初始化;

作为测试,可以在调用.getUsername()之前立即在currentClient上调用.setUsername()吗?这应该有助于我们缩小问题的范围,将其隔离到类访问权限或正在初始化的变量中。

另外,您知道如何使用断点进行调试吗?您提到自己是新手,所以您可能不知道这是可能的。如果您使用的是Eclipse(或其他优秀的IDE),则可以设置断点并在DEBUG构建中运行该程序,那么当该程序到达您在其上设置断点的行时,该程序将冻结,并且您可以观察程序逐行移动行,并在程序更新变量时查看它们。 Google Java调试教程。 :)

09-25 21:46