【问题标题】:ERROR: This method must return a result of type int错误:此方法必须返回 int 类型的结果
【发布时间】:2015-06-11 13:15:39
【问题描述】:

代码:

import java.util.*;

public class shuffleDeck
{ 
    public static int shuffleDeck (int[] deck, int theNumber)
    {
        int [] array1 = new int [52];

        Random random = new Random();
        for (int i = deck.length, j, tmp; i > 1; i--) {
            j = random.nextInt(i);

            tmp = deck[i - 1];
            deck[i - 1] = deck[j];
            deck[j] = tmp;
            return theNumber;
        }
    }

    public static void main(String[] args)
    {
        int [] deck = new int [52];
        for(int i=0; i<52; i++)
        {
            deck[i]=i+1;
        }
        int count;
        count=1;
        int total=1;
        shuffleDeck(deck, count);
        System.out.println();
    }
}

shuffleDeck 方法有错误。我不确定这意味着我需要返回一些东西,但它不会返回,而且我收到了这个奇怪的错误。

我无法解决这个问题,我环顾了整个堆栈。 感谢谁能帮我解决这个错误。

【问题讨论】:

  • 类名和方法名不能相同。它变成了一个构造函数。
  • 如果在循环的第一次迭代中从方法返回,为什么会有循环?如果您只返回未修改的给定值,为什么还要有任何代码?到那时……为什么还要退回任何东西?调用代码已经具有该值。
  • 您还返回了 theNumber 参数的未更改值,这是故意的吗?这也与您的问题有些相关:theNumber 是一个普通的旧int,而不是int[],因此它与您声明的int[] 的返回类型不兼容。
  • 请遵守 Java 命名约定 (oracle.com/technetwork/java/codeconventions-135099.html)。这可能会阻止您的错误

标签: java


【解决方案1】:

在 java 中,当你定义一个方法时,该方法要么必须返回一个值,要么必须用 void 关键字声明。

public static int shuffleDeck(int[] deck);

表示,您将使用 return 关键字返回一个原始整数 (int) .

public static int shuffleDeck(int[] deck);

表示,你不会返回一些东西,因此这里使用 void 来声明它。

最后,我认为这是您尝试完成的,您提供的代码存在一些问题,可能您可以查看下面的示例;

import java.util.Random;

public class Test1 {

    public static void shuffleDeck(int[] deck) {
        int[] array1 = new int[52];

        Random random = new Random();
        for (int i = deck.length, j, tmp; i > 1; i--) {
            j = random.nextInt(i);

            tmp = deck[i - 1];
            deck[i - 1] = deck[j];
            deck[j] = tmp;
        }
    }

    public static void main(String[] args) {
        int[] deck = new int[52];
        for (int i = 0; i < deck.length; i++) {
            deck[i] = i + 1;
        }

        System.out.println("Initial Ordered Deck");
        printDeck(deck);

        int count;
        count = 1;
        int total = 1;

        shuffleDeck(deck);

        System.out.println("Shuffled Deck");
        printDeck(deck);

    }

    private static void printDeck(int[] deck) {
        System.out.println("**************************************");

        for (int i = 0; i < deck.length; i++) {
            if (i % 13 == 0 && i > 0 )
                System.out.println();

            System.out.printf("%2d ", deck[i]);
        }

        System.out.println("\n**************************************");
        System.out.println();
    }

}

输出是;

Initial Ordered Deck
**************************************
 1  2  3  4  5  6  7  8  9 10 11 12 13 
14 15 16 17 18 19 20 21 22 23 24 25 26 
27 28 29 30 31 32 33 34 35 36 37 38 39 
40 41 42 43 44 45 46 47 48 49 50 51 52 
**************************************

Shuffled Deck
**************************************
22  6 13 11 35 23 29 27  8 30 44 20  1 
31 34 28 47  5 46 17 51 38  3 19 36 18 
42 33  7  4  2 24 41  9 15 45 21 16 37 
14 48 43 49 32 12 40 39 26 50 52 10 25 
**************************************

【讨论】:

    【解决方案2】:

    改变

    public static int shuffleDeck (int[] deck, int theNumber)
    

    public static void shuffleDeck (int[] deck, int theNumber)
    

    如果您定义return type,您必须提供一个。 void 定义不需要返回类型。 在这种情况下删除:

    return theNumber;
    

    shuffleDeck 方法内。

    【讨论】:

    • theNumber 根本没有改变。我相信这不是OP想要的。将返回类型更改为void 应该是答案。
    【解决方案3】:

    这是因为您已将返回类型声明为 int 并且您已在 for 循环中给出了 return 语句,现在想想如果您的代码不进入 for 循环而不是没有 return 语句会发生什么,

    所以让你的代码像

    public static int shuffleDeck (int[] deck, int theNumber)
      {
     int [] array1 = new int [52];    
        Random random = new Random();
        for (int i = deck.length, j, tmp; i > 1; i--) {
            j = random.nextInt(i);    
            tmp = deck[i - 1];
            deck[i - 1] = deck[j];
            deck[j] = tmp;
            return theNumber;
        }
       return 0;
    }
    

    【讨论】:

      【解决方案4】:

      你的类名大写以区分类和方法:

      public class ShuffleDeck {
      ...
      

      也许重命名方法会更好:

      public static int doTheShuffle(int[] deck, int theNumber) {
      

      如果您希望函数返回合理的值,请将 return 退出循环:

      for (int i = deck.length, j, tmp; i > 1; i--) {
          j = random.nextInt(i);
      
          tmp = deck[i - 1];
          deck[i - 1] = deck[j];
          deck[j] = tmp;
      }
      
      return theNumber;
      

      但所有这些只会让编译器不会抱怨语法错误。 您的算法仍有错误

      【讨论】:

        【解决方案5】:

        根据你的主要方法,我想,你想要的是洗牌给定的count 次,为此你应该更新方法如下:

        public static void shuffleDeck (int[] deck, int theNumber)
        {
            Random random = new Random();
            for (int k=0; k < theNumber; k++) {
                for (int i = deck.length, j, tmp; i > 1; i--) {
                    j = random.nextInt(i);
        
                    tmp = deck[i - 1];
                    deck[i - 1] = deck[j];
                    deck[j] = tmp;
                }
            }
        }
        

        返回您实际进行随机播放的次数没有意义......根据您的输入。 https://stackoverflow.com/a/30757452/4234940 中发布的内部循环只是洗牌本身......所以实际上我会这样改变它:

        public static void shuffleDeck (int[] deck, int theNumber)
        {
            Random random = new Random();
            for (int k=0; k < theNumber; k++) {
                shuffle(deck, random);
            }
        }
        
        private static void shuffle(int[] array, Random random){
            for (int i = array.length, j, tmp; i > 1; i--) {
                j = random.nextInt(i);
        
                tmp = array[i - 1];
                array[i - 1] = array[j];
                array[j] = tmp;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-03-08
          • 1970-01-01
          • 2013-09-02
          • 1970-01-01
          • 2017-02-25
          • 1970-01-01
          • 2013-12-18
          • 2015-09-25
          相关资源
          最近更新 更多