价值不会从一个类转移到另一个JAVA

时间:2015-01-20 18:06:43

标签: java nullpointerexception

我在使用idS时遇到问题。在sellContainer中,idS为1且在sellCtr中始终为0,因此方法addItemToSell无效。总是给空指针异常。

public class SellCtr{
    private SellContainer sellContainer;
    private OrderLineSell ols;

    private int idS;
    private int idOls;

    public SellCtr(){
       sellContainer = SellContainer.getInstance();
    }

    public void createSell(String date, Customer c, Employee e){
       Sell sell = new Sell(date,c,e);
       sellContainer.addSell(sell);
       idS = sell.getId();
    } 

    public void addItemToSell(OrderLineSell orderLineSell){
       sellContainer.findSell(idS).addOrderLineSell(orderLineSell);
    }

    public int getId(){
       return idS;
    }

    public int getIdOls(){
       return idOls;
    }

    public Sell findSell(int idS){
      return sellContainer.findSell(idS);
    }
}

,另一个类是:

public class SellContainer{
    private ArrayList<Sell> sales;
    private static int idS=0;
    private static SellContainer instance=null;

    public SellContainer(){
        sales = new ArrayList<>();
    }

    public static SellContainer getInstance(){
        if(instance == null){
            instance = new SellContainer();
        }
        return instance;
    } 

    public void addSell(Sell s){
        idS++;
        s.setId(idS);
        sales.add(s);


    }

    public Sell findSell(int idS){
        for(Sell sell : sales){
            if(sell.getId()==idS){
                return sell;
            }
        }
        return null;
    }
}

这是错误:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at controlLayer.SellCtr.addItemToSell(SellCtr.java:24)
at tuiLayer.SaleAddItemToSaleGUI$2.actionPerformed(SaleAddItemToSaleGUI.java:93)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

我重建了项目并更改了例外。

编辑3:我已经使idS静态,现在它可以工作了。非常感谢你们!

2 个答案:

答案 0 :(得分:0)

我建议你

  • 确保您正在编译所有课程。像maven或gradle这样的构建工具会有所帮助。
  • 您使用enum作为单身人士。这些是线程安全且更简单的。
  • 禁用eclipse中的功能,允许您运行无法编译的代码。这只会延迟发现导致情况恶化的错误。

我会替换

public class SellContainer{
    private ArrayList<Sell> sales;
    private static int idS=0;
    private static SellContainer instance=null;

    public SellContainer(){
        sales = new ArrayList<>();
    }

    public static SellContainer getInstance(){
        if(instance == null){
            instance = new SellContainer();
        }
        return instance;
    } 

public enum SellContainer {
    INSTANCE;
    private final List<Sell> sales = new ArrayList<>();
    private int idS = 0;

答案 1 :(得分:0)

在返回对象返回被调用方法之前启动对象。 在SellContainer中,如果条件失败导致将Sell Object返回为NULL。 你需要修改这个逻辑。

返回null;