奇迹Java不可能代码?

时间:2016-09-23 06:58:14

标签: java debugging

这是我的一个编程竞赛的代码,它很乱,我没有改变任何东西。只是告诉你奇迹。

MainClass.java

import java.util.*;

public class MainClass {

    private static Scanner scan = new Scanner(System.in);
    private static Scanner scanText = new Scanner(System.in);

    private static int[][] list;
    private static int row, col;

    private static int lazyCode = 0;

    public static void main(String[] args) {

        col = scan.nextInt();
        row = scan.nextInt();

        list = new int[row][col];
        for (int i = 0; i < row; ++i) {
            for (int j = 0; j < col; ++j) {
                list[i][j] = 0;
            }
        }

        ArrayList<ArrayList<Point>> lazyList = new ArrayList<ArrayList<Point>>();

        String line = scanText.nextLine();
        Scanner temp_scan = new Scanner(line).useDelimiter(",");

        while (temp_scan.hasNext()) {

            String str = temp_scan.next().toString();

            char isLazy = str.charAt(str.length() - 1);

            if (isLazy == '*') {

                lazyList.add(new ArrayList<Point>());
                Point p = findNextSeat();

                int lc = lazyCode;
                list[p.r][p.c] = lc + 10;
                lazyList.get(lc).add(p);
                lazyCode++;

            } else {

                char character = str.charAt(0);
                int temp = character - 65;
                int temp2 = Integer.parseInt(str.substring(1)) - 1;
                System.out.println();// ------------------------BreakPointHere
                int x = list[temp][temp2];// ------------------------BreakPointHere
                System.out.println();// ------------------------BreakPointHere
                if (x == 0) {
                    list[temp][temp2] = 1;
                } else {
                    Point p = findNextSeat();

                    int lc = list[temp][temp2] - 10;
                    list[temp][temp2] = 1;
                    list[p.r][p.c] = lc + 10;
                    lazyList.get(lc).add(p);
                }
            }
        }

        for (int i = 0; i < lazyList.size(); ++i) {
            for (int j = 0; j < lazyList.get(i).size(); ++j) {
                Point p1 = lazyList.get(i).get(j);
                char c1 = (char) (p1.c + 65);
                if (i == lazyList.size() - 1 && j == lazyList.get(i).size() - 1) {
                    System.out.print(c1 + p1.r + ",");
                } else {
                    System.out.print(c1 + p1.r);
                }
            }
            System.out.println();
        }
    }

    private static class Point {
        Point(int i1, int i2) {
            r = i1;
            c = i2;
        }
        int r;
        int c;
    }

    private static Point findNextSeat() {
        for (int r = 0; r < row; ++r) {
            for (int c = 0; c < col; ++c) {

                if (list[r][c] == 0) {
                    return new Point(r, c);
                }
            }
        }
        return null;
    }

}

输入:

  

2

     

9

     

A1,A4,A6,B1

注意: 对于输入,我不能给你比赛的实际输入,因为他们不允许我们这样做,所以我只是提供一些有用的输入。

在Eclipse中 看到我的“BreakPoint”,在这些行中断,然后调试它,首先迭代就可以了。但是,在第二次迭代中,第二行的断点将会运行两次!两次!!!然后那个例外。是的,中间代码会运行两次! 我正在为整个比赛研究这个令人难以置信的问题。我已经编程了7年,这是我生命中第一次看到如此伟大的史诗般的未知错误。

1 个答案:

答案 0 :(得分:0)

您当然可以在窗口&gt;中选择暂停执行未捕获的异常偏好&gt; Java&gt;调试已激活,因此调试器会在您的线路上停止两次:由于断点一次,因为ArrayIndexOutOfBoundsException而一次。