debugging 调试器从不在学习任务中的断点处停止

vulvrdjw  于 2023-05-23  发布在  其他
关注(0)|答案(1)|浏览(89)
import java.time.LocalDate;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.Scanner;
import java.util.stream.Collectors;
import java.util.stream.Stream;

class ProcessDeliveryOrders {

    public static DeliveryOrder findFirstOrder(List<DeliveryOrder> orders) {
        return new DeliveryOrder();  // Breakpoint.
        // write your code here
    }

    public static void printAddressesToDeliver(List<DeliveryOrder> orders) {
        System.out.println(); // Breakpoint.
        // write your code here
    }

    public static void main(String[] args) {
        final Scanner scanner = new Scanner(System.in);

        List<DeliveryOrder> orders = Stream.iterate(1, i -> scanner.hasNextLine(), i -> i + 1)
                .map(i -> scanner.nextLine().split("\\|"))
                .map(parts -> new DeliveryOrder(
                        Long.parseLong(parts[0]), parts[2], LocalDate.parse(parts[1])))
                .collect(Collectors.toList());

        System.out.println(findFirstOrder(orders));  // Breakpoint.

        printAddressesToDeliver(orders);
    }
}

class DeliveryOrder {
    private final long orderId;
    private final String address;
    private final LocalDate deliveryDate;
    // there are even more fields: customer name, phone, products info, etc

    public DeliveryOrder() {
        this.orderId = -1;
        this.address = "No address";
        this.deliveryDate = LocalDate.MIN;
    }

    public DeliveryOrder(long orderId, String address, LocalDate deliveryDate) {
        this.orderId = orderId;
        this.address = address;
        this.deliveryDate = deliveryDate;
    }

    public static Comparator<DeliveryOrder> getComparatorByDeliveryDate() {
        return Comparator.comparing(DeliveryOrder::getDeliveryDate);
    }

    public long getOrderId() {
        return orderId;
    }

    public String getAddress() {
        return address;
    }

    public LocalDate getDeliveryDate() {
        return deliveryDate;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        DeliveryOrder that = (DeliveryOrder) o;
        return address.equals(that.address) &&
                deliveryDate.equals(that.deliveryDate);
    }

    @Override
    public int hashCode() {
        return Objects.hash(address, deliveryDate);
    }

    @Override
    public String toString() {
        return orderId + "|" + deliveryDate + "|" + address;
    }
}

这是一项学习任务。
要运行它,我在控制台中输入以下内容:
样品输入:

1|2021-09-03|112 Mammoth Street, Colorado Springs, CO 80911
2|2021-09-05|369 Woodside Court, Troy, NY 12180
3|2021-09-02|837 Bowman Street, Helena, MT 59601
4|2021-09-03|112 Mammoth Street, Colorado Springs, CO 80911

问题

调试器永远不会到达代码中标记的三个断点中的任何一个。如果不在每个断点上停下来,我就无法理解任务并继续下去。
你能帮助我理解:
1.为什么调试器永远不会到达这些断点中的任何一个?
1.如何科普这一问题?

6jjcrrmo

6jjcrrmo1#

这不是答案,而是:
(我会收回“不是答案”的部分,这可能是一个答案。重复我的评论:)
(The我在这里用来调试代码的StringReader关闭了Scanner的输入。System.in实际上从未关闭。因此,您实际上永远不会到达读取输入的部分之后的代码。你可以试试这个版本,它会帮助你达到这些语句。
可能有帮助的是你的输入可能有问题。键入所有你有什么是相当复杂的,可能容易出错。
如果你在程序中使用一个字符串作为输入,它对你和我们都是可复制的。然后我们都可以放心,我们看到了代码中的相同问题。
例如,在代码中添加一些测试向量:

class ProcessDeliveryOrders {
   
   static String testVectors = "1|2021-09-03|112 Mammoth Street, Colorado Springs, CO 80911\n" +
"2|2021-09-05|369 Woodside Court, Troy, NY 12180\n" +
"3|2021-09-02|837 Bowman Street, Helena, MT 59601\n" +
"4|2021-09-03|112 Mammoth Street, Colorado Springs, CO 80911";

为了做到这一点,我从字面上复制了你在你的问题中的字符串,并将它们粘贴在字符串文字""的引号之间。
然后在程序中使用该字符串作为“输入”:

public static void main(String[] args) {
    final Scanner scanner = new Scanner( new StringReader( testVectors ) );

    List<DeliveryOrder> orders = Stream.iterate(1, i -> scanner.hasNextLine(), //... etc.

现在,您的代码对每个人都以完全相同的方式工作,我们都可以调试完全相同的问题。

相关问题