【问题标题】:Returning value from method and "The Value Assigned Is Never Used"从方法返回值和“分配的值从未使用过”
【发布时间】:2022-11-16 08:52:03
【问题描述】:

我正在学习普林斯顿的计算机科学入门课程(我不是学生,只是自学)。我正在处理这个assignment

Main 调用了两个方法:amplify 和 reverse,这两个方法都返回一个数组。 Amplify 将数组中的所有值乘以常数 alpha。 Reverse 返回一个数组,该数组以相反的顺序列出原始数组值,例如。 {1,2,3} -> {3,2,1}。

Amplify 工作正常,但是当我调用 reverse 时什么也没有发生,我得到一个错误指出:The Value Assigned Is Never Used

public class audiocollage {
    // Returns a new array that rescales a[] by a factor of alpha.
    public static double[] amplify(double[] a, double alpha) {
        for (int i = 0; i < a.length; i++) {
            a[i] = a[i] * alpha;
        }
        return a;
    }

    // Returns a new array that is the reverse of a[].
    public static double[] reverse(double[] a) {
        double[] b = new double[a.length];
        for (int i = a.length - 1, j = 0; i >= 0; i--, j++) {
            b[j] = a[i];
        }
        return b;
    }

    // Creates an audio collage and plays it on standard audio.
    public static void main(String[] args) {
        double[] samples = StdAudio.read("cow.wav");
        double alpha = 2.0;

        samples = amplify(samples, alpha);
        samples = reverse(samples);
    }
}

【问题讨论】:

  • 那是警告,不是错误。编译器只是指出,在将 reverse 的返回值分配给 samples 后,samples 中的值未被使用。你是什​​么意思“当我打电话给 reverse 时什么也没有发生”?你期望发生什么?
  • 你对 samples 什么都不做(在从反向分配结果之后),所以 Java 编译器警告你,这个分配是不必要的(你可以只做 reverse(samples);)。

标签: java arrays return


【解决方案1】:

听起来你有两个问题:

  1. 为什么当我拨打reverse(samples) 时没有任何反应?

    您显示的代码对 reverse(samples) 的结果没有任何作用,只是将其存储在变量 samples 中(覆盖其先前的值)。之后您需要对 samples 执行一些操作以观察新数组(例如打印 samples,现在应该显示为相反)。

    这就引出了下一个问题:

    1. 为什么我收到有关“分配给 samples 的值从未使用过”的警告?

    这是一条警告,说明您编写的代码没有执行任何操作。 Dead store to local variable 是警告的第一行,它描述了正在发生的事情:存储到 samples 的值是“dead”——它再也不会被使用,所以我们也可以完全跳过该行。这会导致您的编译器(或扩展)向我们发出警告,因为几乎可以肯定您编写的代码是不是做你想做的,所以在很多情况下,警告有助于发现错误。

    这个警告可以通过使用 samples 以某种方式解决,例如打印它,用它调用另一个函数等。

    上一行

     samples = amplify(samples, alpha);
    

    不会生成该警告,因为它的输出用于以下对 reverse() 的调用:

    samples = reverse(samples);
    //                  ^ usage of `samples` variable!
    

    通过为所有数组使用不同的变量,这一点变得更加清晰:

        public static void main(String[] args) {
            // No warning; samplesRaw used later
            double[] samplesRaw = StdAudio.read("cow.wav");
            double alpha = 2.0;
    
            // No warning; samplesAmplified used later
            samplesAmplified = amplify(samplesRaw, alpha);
    
            // WARNING! samplesReversed is never used!
            samplesReversed = reverse(samplesAmplified);
        }
    

【讨论】:

    【解决方案2】:

    如果提示与最后一行相关,则意味着您有一个局部变量 samples 尚未使用(您分配了一个值但从未读取过)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-12
      • 2013-10-08
      • 1970-01-01
      • 1970-01-01
      • 2014-09-05
      • 2012-06-16
      • 1970-01-01
      • 2023-03-30
      相关资源
      最近更新 更多