【问题标题】:Getting data from an ArrayList in one class to another从一个类中的 ArrayList 获取数据到另一个类
【发布时间】:2016-06-21 13:27:47
【问题描述】:

所以我试图将存储在一个类 Liquor 的 ArrayList 中的数据显示到另一个类 Bar 中。 ArrayList 包含 5 个字符串(酒的名称)和 5 个整数(每种酒的库存量)。当我运行代码以显示信息时,我收到一个很长的错误:

线程“AWT-EventQueue-0”中的异常 java.lang.NullPointerException 在 barinventory.BarInv.jButtonDisplayActionPerformed(BarInv.java:355) 在 barinventory.BarInv.access$200(BarInv.java:8) 在 barinventory.BarInv$3.actionPerformed(BarInv.java:219) 在 javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) 在 javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348) 在 javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 在 javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 在 javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 在 java.awt.Component.processMouseEvent(Component.java:6535) 在 javax.swing.JComponent.processMouseEvent(JComponent.java:3324) 在 java.awt.Component.processEvent(Component.java:6300) 在 java.awt.Container.processEvent(Container.java:2236) 在 java.awt.Component.dispatchEventImpl(Component.java:4891) 在 java.awt.Container.dispatchEventImpl(Container.java:2294) 在 java.awt.Component.dispatchEvent(Component.java:4713) 在 java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888) 在 java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525) 在 java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466) 在 java.awt.Container.dispatchEventImpl(Container.java:2280) 在 java.awt.Window.dispatchEventImpl(Window.java:2750) 在 java.awt.Component.dispatchEvent(Component.java:4713) 在 java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758) 在 java.awt.EventQueue.access$500(EventQueue.java:97) 在 java.awt.EventQueue$3.run(EventQueue.java:709) 在 java.awt.EventQueue$3.run(EventQueue.java:703) 在 java.security.AccessController.doPrivileged(Native Method) 在 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 在 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) 在 java.awt.EventQueue$4.run(EventQueue.java:731) 在 java.awt.EventQueue$4.run(EventQueue.java:729) 在 java.security.AccessController.doPrivileged(Native Method) 在 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 在 java.awt.EventQueue.dispatchEvent(EventQueue.java:728) 在 java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 在 java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 在 java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 在 java.awt.EventDispatchThread.run(EventDispatchThread.java:82) BUILD STOPPED(总时间:12 秒)

我的酒类:

final class Liquor
{
    //String[] liquor = {"Vodka", "Whiskey", "Rum", "Gin", "Brandy"};
    private final String vodka, whiskey, rum, gin, brandy;
    private final int vCount, wCount, rCount, gCount, bCount;
    ArrayList<Liquor> liquors = new ArrayList<>();

//    public Liquor(ArrayList<Liquor> liquors)
//    {
//        
//        this.vodka = "Vodka";
//        this.whiskey = "Whiskey";
//        this.rum = "Rum";
//        this.gin = "Gin";
//        this.brandy = "Brandy";
//        this.vCount = getVC();
//        this.wCount = getWC();
//        this.rCount = getRC();
//        this.gCount = getGC();
//        this.bCount = getBC();
//    } was trying to pass it through the ArrayList itself... Didn't work.
      //The stock number kept being read in as 0.



    public Liquor(String vodka, String whiskey, String rum, String gin, 
            String brandy, int v, int w, int r, int g, int b)
    {
        this.vodka = vodka;
        this.whiskey = whiskey;
        this.rum = rum;
        this.gin = gin;
        this.brandy = brandy;
        this.vCount = v;
        this.wCount = w;
        this.rCount = r;
        this.gCount = g;
        this.bCount = b;
    }

    public String getV()
    {
        return vodka;
    }

    public String getW()
    {
        return whiskey;
    }

    public String getR()
    {
        return rum;
    }

    public String getG()
    {
        return gin;
    }

    public String getB()
    {
        return brandy;
    }

    public int getVC()
    {
        return vCount;
    }

    public int getWC()
    {
        return wCount;
    }

    public int getRC()
    {
        return rCount;
    }

    public int getGC()
    {
        return gCount;
    }

    public int getBC()
    {
        return bCount;
    }

    @Override
    public String toString()
    {
        return "\nLiquor currently in stock:\n" + vodka + ": " + vCount + "\n" +
                whiskey + ": " + wCount + "\n" + rum + ": " + rCount + "\n" +
                gin + ": " + gCount + "\n" + brandy + ": " + bCount;
    }
}

我的酒吧班:

class Bar
{
    private final String barLoc, barName;
    private final boolean music, food;
    //ArrayList<Liquor> liquor;

    public Bar(String l, String n, boolean m, boolean f)
    {
        this.barLoc = l;
        this.barName = n;
        this.music = m;
        this.food = f;
    }

    //ArrayList<Liquor> liquor = new ArrayList<>();
    private Liquor liquor;

    public Liquor getLiquor()
    {
        return liquor;
    }

    @Override
    public String toString()
    {
        return "The " + barLoc + " bar is named: " + barName + "\nLive music: " 
                + music + "\nFood Service: " + food;
    } 
}

用于显示的代码:

for(int i=0; i<bars.size(); i++)
        {
            jTextAreaDisplay.append(jTextAreaDisplay.getText() 
                    + bars.get(i).toString() + bars.get(i).getLiquor().toString() 
                    + "\n\n");

        }

我认为问题与在我的 Bar 类中初始化 private Liquor liquor; 有关,我尝试过不同的方式。但是阿特拉斯无法做到这一点。任何帮助将不胜感激!

示例运行:

(barLocation) 条被命名为:(barName)

现场音乐:(真假)

餐饮服务:(对或错)

目前有库存的酒类:

伏特加:(库存量)

威士忌:(库存量)

朗姆酒:(库存量)

杜松子酒:(库存量)

白兰地:(库存量)

【问题讨论】:

  • 你是对的——你根本没有初始化酒属性,而是试图在它上面调用方法
  • bars.get(i).getLiquor().toString() 替换为bars.get(i).getLiquor() 以消除异常,但这并不能解决您的逻辑问题
  • 您也会对 ArrayList#toString 的结果感到失望
  • 好的,那我怎样才能读入数据呢?而是如何正确初始化我的酒?

标签: java swing user-interface arraylist


【解决方案1】:

据我所知,您从未初始化过酒。

初始化如下所示

Liquor liquor = new Liquor("data", "data", ...);

我不明白创建一个包含更多液体(伏特加等)的单一酒类对象的目的。但也许你有你的理由。 如果不是,那么我会以不同的方式设计 Liquor,因为你所做的并不真正类似于现实。 通常,Liquor 类应该具有如下属性:

public String name;
public double alcohol;

然后我会在您的酒吧中创建一个 Liquors 的 ArrayList 并用一些值填充它。

ArrayList<Liquor> liquors = new ArrayList<Liquor>();
//Fill with something like 4 liquors i call them vodka 0, 1, 2 and 3 and fill them with the alcohol value of 40
for(int i = 0; i < 4; i++){
  liquors.add(new Liquor("Wodka"+i, 40));
}

现在我的填充方法显然需要你的 Liquid 类有一个带有 2 个参数(字符串名称,int酒精)的构造函数

【讨论】:

    【解决方案2】:

    你还没有初始化 Liquor 对象。试试下面的语句

    private Liquor liquor=new Liquor("vodka",""...,1,2,..);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多