奇怪的行为。 '=='无法正常工作

时间:2015-05-24 03:33:25

标签: java

我有这段代码,我现在已经工作了大约半个小时了。它非常简单,但它不起作用。我有一个方法,它应该返回三个数字,这些数字与给定的参数相加。我希望它是随机的,所以我使用Random类。但首先我必须确保它是正确的。如果不对。我只是重新运行该方法,直到它返回一个正确的值。但由于某种原因,我不断收到StackOverflowException。真的很奇怪。 '=='运算符根本不起作用!这是我正在使用的完整代码(我确实简化了它,因此我可以很容易地显示它):

public static int[] getNumbersFor(int f)
{
    Random r = new Random();
    int l = (r.nextInt(20) + 20) / 2;
    int a = l + l % 2;
    int[] i = new int[]
    {
        (int) (f - a / 2 - l % 2), 
        (int) (f + a), 
        (int) (f - a / 2 + l % 2)
    };
    int b = (i[0] + i[1] + i[2]);
    int c = ((i[0] + i[1] + i[2]) / 3);
    boolean d = i[0] + i[1] + i[2] == f / 3;
    System.out.println(f + ", " + a + ", " + b + ", " + c + ", " + d);
    return i[0] + i[1] + i[2] == f / 3 ? i : getNumbersFor(f);
}

public static void main(String[] args)
{
    int[] i = getNumbersFor(33);
    System.out.println(i[0] + ", " + i[1] + ", " + i[2]);
}

这应该是正确的!它不是。我不知道为什么它不正确!我想知道它是否与我的计算机本身有关,所以我here's(pastebin)从System.getProperties().list(System.out)的完整日志中获得了什么。如果你需要知道这个的输出。这是我一直得到的错误本身的一小部分:

33, 14, 99, 33, false
33, 10, 99, 33, false
33, 14, 99, 33, false
33, 16, 99, 33, false
33, 20, 99, 33, false
Exception in thread "main" java.lang.StackOverflowError
    at sun.nio.cs.UTF_8.updatePositions(UTF_8.java:77)
    at sun.nio.cs.UTF_8$Encoder.encodeArrayLoop(UTF_8.java:564)
    at sun.nio.cs.UTF_8$Encoder.encodeLoop(UTF_8.java:619)
    at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:561)
    at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:271)
    at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:125)
    at java.io.OutputStreamWriter.write(OutputStreamWriter.java:207)
    at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:129)
    at java.io.PrintStream.write(PrintStream.java:526)
    at java.io.PrintStream.print(PrintStream.java:669)
    at java.io.PrintStream.println(PrintStream.java:806)
    at moretesting.NewClass.getNumbersFor(NewClass.java:16)
    at moretesting.NewClass.getNumbersFor(NewClass.java:17)
    at moretesting.NewClass.getNumbersFor(NewClass.java:17)
    at moretesting.NewClass.getNumbersFor(NewClass.java:17)
    at moretesting.NewClass.getNumbersFor(NewClass.java:17)
    ... (This is repeated TONS of times, I just omitted it)

Here's完整日志。 (再次粘贴。它非常大,几千行!)

3 个答案:

答案 0 :(得分:3)

==工作正常,你只是在比较不相等的事情。以下是运行代码的示例值评估:

i[0] + i[1] + i[2] == f / 3
26   + 47   + 26   == 33 / 3
99                 == 11
false

生成的每组数字都遵循这种模式:数字总和为99,你将它与11进行比较,它因为条件为假而递归,然后由于无限递归而堆叠溢出(它不能产生将通过的值条件)。

答案 1 :(得分:0)

这行代码是递归调用你的函数。

class boxes {
protected:
    int x = 0;
public:
    void setx (int input) {
        x = input;
    }
    int getx () {
        return x;
    }
} box;

box.setx(5);
vector <boxes> tetris;
tetris.push_back(box);
cout << box.getx();
cout << tetris.back().getx();

仔细检查您的代码并理解递归永远不会终止的原因。

调用函数调用时,会在调用堆栈上分配堆栈帧。堆栈帧包含调用方法的参数,其本地参数以及方法的返回地址。 如果没有新堆栈帧的空间,那么Java虚拟机(JVM)将抛出StackOverflowError。

谨慎使用函数递归。如果您已验证正确实现了递归,则可以增加堆栈的大小,以便允许更多的调用。

答案 2 :(得分:0)

我不确定递归真的是解决这个问题的方法。至少,随机猜测数字,直到你偶然发现一个加起来你的输入的组合似乎非常低效。

如果您只是在寻找三个与输入参数相加的伪随机数,为什么不这样做呢?

public static int[] getNumbersFor(int number)
{
    int firstMax = 0;
    int firstMin = 0;

    int secondMax = 0;
    int secondMin = 0;

    if (number > 100)
    {
        firstMax = 100;

        if (number > 200)
        {
            firstMin = number - 200;
        }
    }

    Random r = new Random();
    int firstRand = r.nextInt(firstMin, firstMax);

    int a = firstRand;

    int temp = number - a;

    if (temp > 100)
    {
        secondMax = 100;
        secondMin = temp - 100;
    }

    int secondRand = r.nextInt(secondMin, secondMax);

    int b = secondRand;

    int c = temp - b;

    return new int[] { a, b, c };
}