Java 奇怪的行为'==';工作不正常

Java 奇怪的行为'==';工作不正常,java,Java,我有这个代码,我已经工作了大约半个小时了。它非常简单,但就是不起作用。我有一个方法,它应该返回三个数字,加起来就是给定的参数。我希望它是随机的,所以我使用随机类。但首先我必须确保它是正确的。如果不正确的话。我只是再次运行该方法,直到它返回正确的值。但出于某种原因,我一直收到StackOverflowException。真奇怪。“==”运算符根本不工作!下面是我正在使用的完整代码(我简化了它,以便可以轻松地显示它): 这应该是正确的!只是没有。我不知道为什么它不正确!我想知道它是否与我的计算机本身

我有这个代码,我已经工作了大约半个小时了。它非常简单,但就是不起作用。我有一个方法,它应该返回三个数字,加起来就是给定的参数。我希望它是随机的,所以我使用随机类。但首先我必须确保它是正确的。如果不正确的话。我只是再次运行该方法,直到它返回正确的值。但出于某种原因,我一直收到StackOverflowException。真奇怪。“==”运算符根本不工作!下面是我正在使用的完整代码(我简化了它,以便可以轻松地显示它):

这应该是正确的!只是没有。我不知道为什么它不正确!我想知道它是否与我的计算机本身有关,所以(粘贴)我从
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)

完整日志。(同样是pastebin。它非常大,只有几千行!)

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

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

生成的每一组数字都遵循以下模式:数字总和为99,将其与11进行比较,它会因为条件为false而递归,然后由于无限递归而堆栈溢出(它无法生成将通过条件的值)。

这行代码递归地调用您的函数

return i[0] + i[1] + i[2] == f / 3 ? i : getNumbersFor(f);
仔细检查您的代码,并理解递归从未终止的原因

调用函数调用时,会在调用堆栈上分配堆栈帧。堆栈框架包含被调用方法的参数、其本地参数和方法的返回地址。 如果没有空间容纳新的堆栈帧,则Java虚拟机(JVM)会抛出StackOverflowerError


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

我不确定递归是否真的是解决这个问题的方法。至少,随机猜测数字,直到你碰巧发现一个组合,加在一起,你的输入似乎效率低下得可怕

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

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 };
}

这段代码乱七八糟。你试过在调试器中单步执行它吗?也许这个条件从来都不是真的
20+99+33
不等于
33/3
。你的数字加起来总是99。当您检查
f/3
时,这就是
f*3
。如果这有帮助的话,“
=
操作符根本不起作用!”在你这么说之前,你有没有检查过调试器?您会注意到数组中
int
s的总和是
f*3
,而不是
f/3
。投票结束,天哪。我非常抱歉,伙计们!我看错了。我真为我的愚蠢感到抱歉。阿米尔·阿富汗尼,有什么乱七八糟的?也许我能修好。是的,你完全正确。我把方程分成了错误的一方。真是个愚蠢的错误。谢谢。哦,非常有趣!不幸的是,我似乎从中得到了一个错误。特别是从r.Next方法。我假设你指的是nextInt(…)方法是的,对不起,
nextInt
是我的意思,我已经相应地编辑了我的答案。我想我把Java和C弄糊涂了嗯,效果很好。当a、b和c不能超过100时,您能为我建议一种方法吗?所以它不可能是,40,64,102。这正是我想要的。这是一个很好的问题。这可能会导致各种各样的困难,这取决于可以传递的数字的范围。例如,如果您传入一个大于300的数字,那么我的解决方案中至少有一个数字必须大于100。您知道可能传入的数字范围吗?是,每个数字不能超过100。因此,总添加量不能超过300。谢谢你帮助我!这对我来说真的很重要!绝对正确。谢谢你指出这一点。下次我一定会记得的!
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 };
}