在子类中尝试使用这个对象已经空值。 为什么?(Object has null values wh

2019-09-16 22:49发布

我是一个新手的Java家伙,所以我可能这样做完全错了这整个事情。 我必须做软件工程类这个巨大的项目。 该代码是约2000线长,所以这是框架代码

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

}

我已经敢肯定,我这样做完全错误的,但我的问题是,为什么我不能访问currentClient ClientInfoPanel里面? 说这个的JLabel:

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

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

“目前登录为:”

Answer 1:

您显示的代码看起来很好,所以这个问题是其他地方,或者这个代码是不是代表你有什么。 此外,您已成功访问currentClient,除非你得到一个NullPointerException或某处捕获它,那么.getUsername()调用解决。 所以,真正的问题在于.getUsername(),不知何故用户名是未初始化当你调用.getUsername();

作为一个测试,你可以在currentClient调用.setUsername()调用.getUsername()之前的权利? 这应该有助于我们缩小问题,它隔离要么类访问或变量初始化。

另外,你知道如何使用断点调试? 你刚才提到你是新的,所以你可能不知道这是可能的。 如果您使用的Eclipse(或其他好的IDE),您可以设置断点,并在调试生成运行该程序,那么当它击中你设置断点的行程序将冻结,并且你可以看作为程序的移动线线,并看到变量,因为它们是由程序更新。 谷歌的Java调试教程。 :)



Answer 2:

我同意(不知道我是否应该增加,因为别人已经回答了,什么是礼仪?)。 我跑这很好,这表明我的小组与用户登录和我一样在BookRental构造函数集:

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

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 String username;
     private void setUsername(String u){
      username = u;
     }
     public String getUsername(){
      return username;
     }
   }


   public class ClientInfoPanel extends JPanel{      //Panel showing main menu.
      //At this point currentClient will contain values
      public ClientInfoPanel(){
         initComponents();
      }
      private void initComponents(){
         infoPanelUserName = new JLabel();
         infoPanelUserName.setText("Currently logged in as: " + currentClient.getUsername());
         this.add(infoPanelUserName);
      }
      private JLabel infoPanelUserName;
    }
   public ClientInfoPanel clientInfoPanel;


   //Constructor
   public BookRental(){
       currentClient.setUsername("Me");
       initComponents();
   } 
   private void initComponents(){
       clientInfoPanel = new ClientInfoPanel();
          this.add(clientInfoPanel);
          clientInfoPanel.setVisible(true);
   }

   public static void main(String args[]){

       new BookRental().setVisible(true);
   }
 }


文章来源: Object has null values when subclass attempts to use it. Why?