即使我点击返回Java,也无法跳出while循环

时间:2018-05-24 21:24:41

标签: java debugging while-loop runtime-error infinite-loop

这是我的代码,当我的输入是{2,3,4,5}和= {1}时,即使我点击“返回r1”,我也无法跳出while循环。 该程序将打印“???”,但保持循环,直到它获得索引超出约束的异常。 这是有线的。

int[] nums1 = {2, 3, 4, 5}, nums2 = {1};

public static double findMedianSortedArrays(int[] nums1, int[] nums2) {

    if(nums1.length > nums2.length) {
        findMedianSortedArrays(nums2, nums1);
    }
    int half = (nums1.length + nums2.length) / 2;
    double l1 = 0;
    double l2 = 0;
    double r1 = 0;
    double r2 = 0;
    int cutR = nums1.length;
    int cutL = 0;
    int cut1 = 0;
    while(cut1 <= nums1.length) {
        cut1 = (cutR + cutL) / 2;
        int cut2 = half - cut1;

        l1 = (cut1 == 0) ? Integer.MIN_VALUE : nums1[cut1 - 1];
        r1 = (cut1 == nums1.length) ? Integer.MAX_VALUE : nums1[cut1];
        l2 = (cut2 == 0) ? Integer.MIN_VALUE : nums2[cut2 - 1];
        r2 = (cut2 == nums2.length) ? Integer.MAX_VALUE:nums2[cut2];

        if(l1 > r2)  
            cutR =  cut1 - 1;
        else if(l2 > r1)  
            cutL = cut1 + 1;
        else {
            if((nums1.length + nums2.length) % 2 == 0) { 
                l1 = (l1 > l2) ? l1 : l2;
                r1 = (r1 < r2) ? r1 : r2;
                return (l1 + r1) / 2;
            } else {
                r1 = (r1 < r2) ? r1 : r2;
                System.out.println("???");
                return r1;
            }
        }
    }
    return -1;


}

2 个答案:

答案 0 :(得分:0)

递归调用方法时,在堆栈上创建该方法的新实例。试着把它想象成水平,甚至可能是电影Inception。您在main方法中,并调用run()。您现在处于run()的第1级。如果在第1级再次调用run(),则转到第2级。从第2级返回时,返回到第1级。如果从第1级返回,则返回到原始运行的任何位置()被叫了。

答案 1 :(得分:0)

我可能没有正确理解你打算做什么,但我认为你的问题是由于这个原因:

if(nums1.length > nums2.length) {
    findMedianSortedArrays(nums2, nums1);
}

我认为如果nums1.length&lt; = nums2.length,您的方法有效,如果不是,您只需在交换参数后调用它。

问题发生时你不会对返回值做任何事情(它成功输出???)然后继续使用错误的参数并最终抛出{{ 1}}。

您需要做的就是使用预期顺序的参数返回值:

IndexOutOfBoundException