【问题标题】:for(Room r : ArrayList<Room>) returns empty Roomfor(Room r : ArrayList<Room>) 返回空房间
【发布时间】:2017-11-20 02:38:11
【问题描述】:

我正在研究可以在图像上绘制矩形的东西。它工作得很好,因为 JavaFX 轻而易举,但我遇到了一个我似乎不明白的小问题。

我一直在使用 for (object b : ArrayList),但从来没有发生过这种情况。这是代码的重要部分:

    private void drawRooms() {
    System.out.println("=========================================");
    gc.clearRect(0, 0, canvas.getWidth(), canvas.getHeight());
    gc.drawImage(image, 0, 0);
    boolean bFirst = true;
    double lastX = 0.0, firstX = 0.0, lastY = 0.0, firstY = 0.0;
    gc.setStroke(RED);
    gc.setLineWidth(10);
    System.out.println("alRooms " + alRooms.toString());
    for (Room r : alRooms) {
        System.out.println("r " + r.getCords());
        for (Coordinate c : r.alCords) {
            System.out.println("C " + c.getX());
            if (bFirst) {
                bFirst = false;
                lastX = firstX = c.getX();
                lastY = firstY = c.getY();
            } else {
                gc.strokeLine(lastX, lastY, c.getX(), c.getY());
                lastX = c.getX();
                lastY = c.getY();
            }
        }
        gc.strokeLine(firstX, firstY, lastX, lastY);
        bFirst = true;
    }
}

这是在创建房间后立即调用 drawRoom() 的地方:

                        alRooms.add(new Room(txRoomName.getText(), alCords));
                        System.out.println("alRooms size " + alRooms.size());
                        System.out.println("alRoom to string " + alRooms.toString());
                        alCords.clear();
                        drawRooms();

忽略System.out.println,我一直用它来调试。无论如何,这是控制台输出:

Created new CoorRoom asd
[tcp_test_beacon.Coordinate@71afa660, tcp_test_beacon.Coordinate@8227d0c, tcp_test_beacon.Coordinate@1c50a611, tcp_test_beacon.Coordinate@2a467bed]
alRooms size 1
alRoom to string [tcp_test_beacon.Room@26565463]
=========================================
alRooms [tcp_test_beacon.Room@26565463]
r []

如您所见,我创建了一个房间并将其添加到 alRooms,它是一个 ArrayList。它的 toString() 在添加房间之后,返回与 for() 循环之前的 toString() 相同。我还显示了房间的 alCords.toString,这意味着它具有某种值。 之后,它进入 r 循环,但 getCords() 什么也不返回。这已经很奇怪了,因为 Object Room 的 getCords() 看起来像这样:

    public ArrayList<Coordinate> getCords(){
    return alCords;
}

之后,甚至认为 r.alCords,它是一个 ArrayList,应该存在,它并没有执行 Coordinate 的 for 循环,正如丢失的 System.out 所看到的那样。我在这里看什么?我想我可能遗漏了一些非常明显的东西......

【问题讨论】:

    标签: java loops for-loop arraylist methods


    【解决方案1】:

    从您的 sn-p 中,您可以看到,您使用 Coorinates 创建了新的 Room

     alRooms.add(new Room(txRoomName.getText(), alCords));
     System.out.println("alRooms size " + alRooms.size());
     System.out.println("alRoom to string " + alRooms.toString());
     alCords.clear();
    

    在创建新的Room 期间,您不仅传递了新的List,还传递了对该对象的引用!稍后,在方法执行之前,您将清除它!

    alRooms.add(新房间(txRoomName.getText(), alCords)); alCords.clear();

    稍后我们可以看到,您的foeach 语句正确执行,因为您可以看到r [] 这一行。但是由于上述原因,CoordinatesList 是空的。只需将您的代码更改为如下所示:

     alRooms.add(new Room(txRoomName.getText(), new ArrayList(alCords)));
     System.out.println("alRooms size " + alRooms.size());
     System.out.println("alRoom to string " + alRooms.toString());
     alCords.clear();
    

    【讨论】:

    • 你太棒了。这正是问题所在!我知道参考的东西,但从来没有完全理解那是什么意思。这很棒!有什么办法可以在这里实现它: private void setCords(ArrayList alCords) { this.alCords = alCords; }
    • @Redimo 你可以设置,喜欢setCords(ArrayList&lt;Coordinate&gt; alCords) { this.alCords = new ArrayList(alCords); } 很高兴帮助。干杯。
    • 我想我可能又偶然发现了同样的问题。我有以下 sn-p:public Room(String sName, double xy[]) { this.sName = sName; polydouble = xy; shapeRoom = new Polyline(polydouble); shapeRoom.setFill(TRANSPARENT); shapeRoom.setStrokeWidth(3); shapeRoom.setStroke(RED); } public Polyline getPoly(){ return shapeRoom; } 但是当我执行 Room r : alRooms -> r.getPoly() 时,我得到了一个异常。即使像插入 shapeRoom.getPoints()); 这样简单的事情也会给我一个例外。
    • @Redimo 您不需要 Java 数组。尝试使用列表更改您的解决方案。
    【解决方案2】:

    检查您是否设置了一个有效的alCords 并且它不为空。在线调试

    alRooms.add(new Room(txRoomName.getText(), alCords)); // Debug here
    

    【讨论】:

    • 感谢您的回答,@GensaGames 发现了其中的错误! :)
    猜你喜欢
    • 2020-04-26
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多