【问题标题】:Why isn't it an error?为什么不是错误?
【发布时间】:2014-02-09 15:34:11
【问题描述】:

以下程序是一个递归程序,用于查找数组的最大值和最小值。(我认为!请告诉我它是否不是有效的递归程序。虽然有更简单的方法来查找数组中的最大值和最小值,我以递归方式做只是作为练习的一部分!)

此程序正常运行并按预期产生输出。

在我标记“这里怀疑!”的注释行中,我无法理解为什么在编译过程中没有给出错误。返回类型显然是一个整数数组(在方法定义中指定),但是我没有将返回的数据分配给任何整数数组,但程序仍然可以工作。如果我这样做,我预计在编译过程中会出错,但它确实有效。如果有人能帮我解决这个问题,那会很有帮助! :)

import java.io.*;
class MaxMin_Recursive
{
    static int i=0,max=-999,min=999;
    public static void main(String[] args) throws IOException
    {
        BufferedReader B = new BufferedReader(new InputStreamReader(System.in));
        int[] inp = new int[6];
        System.out.println("Enter a maximum of 6 numbers..");
        for(int i=0;i<6;i++)
            inp[i] = Integer.parseInt(B.readLine());
        int[] numbers_displayed = new int[2];
        numbers_displayed = RecursiveMinMax(inp);
        System.out.println("The maximum of all numbers is "+numbers_displayed[0]);
        System.out.println("The minimum of all numbers is "+numbers_displayed[1]);
    }
    static int[] RecursiveMinMax(int[] inp_arr)     //remember to specify that the return type is an integer array 
    {   
        int[] retArray = new int[2];
        if(i<inp_arr.length)
            {
                if(max<inp_arr[i])
                    max = inp_arr[i];
                if(min>inp_arr[i])
                    min = inp_arr[i];
                i++;
                RecursiveMinMax(inp_arr);       //Doubt here!
            }
        retArray[0] = max;
        retArray[1] = min;
        return retArray;
    }
}

【问题讨论】:

  • 是的,但我会尝试其他方法来让程序正常工作!我刚试过这个。值得一试! :D :)

标签: java arrays recursion


【解决方案1】:

返回类型明明是整数数组(方法定义中指定),但是我没有将返回的数据赋值给任何整数数组,但是程序还是可以的。

是的,因为忽略方法的返回值根本不是错误。就编译器而言,并非如此。它很可能代表一个错误,但它是该语言的完美有效使用。

例如:

Console.ReadLine(); // User input ignored!
"text".Substring(10); // Result ignored!

有时我希望它可以用作警告 - 事实上,当 Resharper 可以检测到“纯”方法(那些没有任何副作用的方法)在不使用返回值的情况下被调用时,它会发出警告.特别是在现实生活中引起问题的调用:

  • string 上的方法,例如 ReplaceSubstring,用户假设调用该方法会更改现有字符串
  • Stream.Read,用户假设 所有 他们请求的数据已被读取,而实际上他们应该使用返回值来查看 实际 读取了多少字节

次完全适合忽略方法的返回值,即使它通常不适用于该方法。例如:

TValue GetValueOrDefault<TKey, TValue>(Dictionary<TKey, TValue> dictionary, TKey key)
{
    TValue value;
    dictionary.TryGetValue(key, out value);
    return value;
}

通常当您调用 TryGetValue 时,您想知道是否找到了密钥 - 但在这种情况下,value 将设置为 default(TValue),即使密钥没有找到了,所以我们还是要返回同样的东西。

【讨论】:

    【解决方案2】:

    在 Java 中(如在 C 和 C++ 中),丢弃函数的返回值是完全合法的。编译器没有义务给出任何诊断。

    【讨论】:

      猜你喜欢
      • 2016-09-19
      • 2016-11-02
      • 2017-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多