如何将返回的数组重新分配给 java 中预先存在的数组

How do I reassign a returned array to a preexisting array in java

这是代码,sigmoid 和 dot 方法 return 一个二维数组。在 sigmoid 和 dot 方法中,名为 outputs 的数组被定义为;
double[][] outputs = new double[size1][size2];,并且 return 与 return outputs;.

这段代码return中的错误"variable outputs might not have been initialized"是这段代码造成的;
System.out.println("Outputs after training are: " + Arrays.toString(outputs));.

double[][] outputs;
for(int i = 0; i < 1; i++){
    inputLayer = trainingInputs;
    outputs = sigmoid(dot(inputLayer, synapticWeights));
}
System.out.println("Outputs after training are: " + Arrays.toString(outputs));

我想消除错误,以便可以将数组 outputs 打印到控制台。

您已经声明了一个变量 outputs 它可能会在您的 for 循环中被初始化。您应该在声明时用 null 初始化它。你的代码应该是这样的。下面的代码片段:

double[][] outputs = null;
for(int i = 0; i < 1; i++){
  inputLayer = trainingInputs;
  outputs = sigmoid(dot(inputLayer, synapticWeights));
}
System.out.println("Outputs after training are: " + Arrays.toString(outputs));

问题不是你想的那样

您正在以正确的方式分配数组。 真正的问题是Java编译器认为代码并不总是outputs赋值。 (这就是编译错误的实际含义......)

为什么?

有两种思考方式:

  • 直觉上,编译器无法判断出循环体 for

    for(int i = 0; i < 1; i++){...}

    总是至少要 运行 一次。

  • 技术上正确的解释是JLS 明确赋值规则并没有说outputs在使用前已经明确赋值。 JLS Chapter 16 处理这个问题。


这里有两个可能的修复方法:

  • 显式初始化变量。

    double[][] outputs = null;
    for(int i = 0; i < 1; i++){
        inputLayer = trainingInputs;
        outputs = sigmoid(dot(inputLayer, synapticWeights));
    }
    System.out.println("Outputs after training are: " + Arrays.toString(outputs));
    
  • 如果这是真实的代码(不是简化的示例),您会发现循环是多余的并删除它!

    double[][] outputs;
    
    inputLayer = trainingInputs;
    outputs = sigmoid(dot(inputLayer, synapticWeights));
    System.out.println("Outputs after training are: " + Arrays.toString(outputs));