【问题标题】:Java: Methods not FunctioningJava:方法不起作用
【发布时间】:2016-11-30 23:27:08
【问题描述】:

我似乎在使用三个用户创建的方法并在主方法中正确调用它们时遇到了问题。我没有任何我知道的语法错误,所以留下了合乎逻辑的错误,参数看起来也很好。

假设该程序的输出类似于下面的最后一个输出。这是一个接受二维数组并检查它是否为magic square 的程序。每种方法都负责审查/检查过程以确定它是否是幻方。

我真的很感激能帮我解决这个问题,我很难过。

代码:

import java.util.Arrays;

public class Magic10
{
    // A method to check whether rows equal the target sum
    private static boolean rowsEqTargetSum(int[][] a, int targetSum, int n, int row, int col, int sum)
    {
    // Calculate the sum of each row ... if magic, then equal to targetSum      
        for(row=0; row<n; row++)
        {
            System.out.print("row "+row+": ");
            for(col=0; col<n; col++)
            {
                int value = a[row][col];
                sum += value;
                if (col > 0)
                    System.out.print(" + "); // print plus before all except 1st
                System.out.print(value);
            }
            System.out.println(" = "+sum);
            if(sum != targetSum)
            {
                System.out.println("Row sum incorrect : Not a magic Square!");
            }
        }
        return rowsEqTargetSum(null, 0, sum, sum, sum, sum);
    }
    // A method to check whether diagonals equal the target sum 
    private static boolean diagonalEqTargetSum(int[][] a, int targetSum, int n, int row, int col, int sum)
    {
        System.out.print("diagonal: ");
        for(int pos=0; pos<n; pos++)
        {

            row = n-1 - pos;
            col = pos;
            int value = a[row][col];
            sum += value;
            if (pos > 0)
                System.out.print(" + "); // print plus before all except 1st
            System.out.print(value);
        }
        System.out.println(" = "+sum);
        if(sum != targetSum)
        {
            System.out.println("Diagonal is incorrect : Not a magic Square!");
        }
        return diagonalEqTargetSum(null, 0, 0, sum, sum, sum);
    }
    // A method to check whether all numbers are used exactly once in the 2D array
    private static boolean allNumbersRepresented(int[][] a, int n, int col, int row)
    {
    // Lastly, we check that every number from 1 to n is represented
        final int nSquare=n*n;
        boolean[] flag= new boolean[n*n];

        for(row=0; row<n; row++)
        {
            for(col=0; col<n; col++)
            {
                int num = a[row][col];
                if (n < 1 || num > nSquare)
                {
                    System.out.println("Number out of range : Not a magic Square!");
                }
                if (flag[num-1]) 
                {
                    System.out.println("Duplicate number : Not a magic Square!");
                }
                flag[num-1] = true;
            }
        }
        return allNumbersRepresented(null, 0, 0, 0);
    }

    public static void main(String []args)
    {
        int[][] a ={{4,9,2},
                    {3,5,7},
                    {8,1,6}};
        final int n=a.length;
        final int targetSum=n*(n*n+1)/2;

        System.out.println(" The following two dimensional array is Magic!");   
        for (int i = 0;i< a.length;i++)
        {
            System.out.println(Arrays.toString(a[i]));
        }

        // Calls rowsEqTargetSum Method
        if (!rowsEqTargetSum(a, targetSum, targetSum, targetSum, targetSum, targetSum))
        {
            return;
        }
        // Calls diagonalEqTargetSum Method
        if (!diagonalEqTargetSum(a, targetSum, targetSum, targetSum, targetSum, targetSum))
        {
                 return;
        }
        // Calls allNumbersRepresented Method
        if (!allNumbersRepresented(a, targetSum, targetSum, targetSum))
        {
                return;
        }
    }
}

当前输出(调用方法有问题?)

 The following two dimensional array is Magic!
[4, 9, 2]
[3, 5, 7]
[8, 1, 6]
row 0: 4 + 9 + 2Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
    at Magic10.rowsEqTargetSum(Magic10.java:14)
    at Magic10.main(Magic10.java:91)

输出看起来有点像这样:

row 0: 4 + 9 + 2 = 15
row 1: 3 + 5 + 7 = 15
row 2: 8 + 1 + 6 = 15
diagonal: 8 + 5 + 2 = 15
 The following two dimensional array is Magic !
[4, 9, 2]
[3, 5, 7]
[8, 1, 6]

【问题讨论】:

  • "遇到麻烦" -- 这是什么意思?请澄清并准确解释正在发生的事情以及您期望发生的事情。包括任何错误消息和/或堆栈跟踪。
  • 我对问题是什么感到困惑,我以为我正确调用了方法并正确设置了它们,但我不知道我做错了什么。
  • 什么不起作用。就像它应该做的,但没有做。
  • 它应该有一个类似于我上面输入的输出。这是一个程序,它接受一个二维数组并检查它是否是一个幻方 (en.wikipedia.org/wiki/Magic_square)。每种方法都有责任审查/检查过程以确定它是否是幻方。

标签: java arrays loops if-statement methods


【解决方案1】:

您需要能够理解异常是什么以及如何解决它。您的代码执行在其输出中显示 java.lang.ArrayIndexOutOfBoundsException 以及您在哪一行得到它。

纠正逻辑的第一步是避免 java.lang.ArrayIndexOutOfBoundsException

您可以如下控制迭代

for(row=0; row<a.length; row++)
    {
        int[] rowArr = a[row];
        System.out.print("row "+row+": ");
        for(col=0; col<rowArr.length; col++)
        {
            int value = a[row][col];
            sum += value;
            if (col > 0)
                System.out.print(" + "); // print plus before all except 1st
            System.out.print(value);
        }
        System.out.println(" = "+sum);
        if(sum != targetSum)
        {
            System.out.println("Row sum incorrect : Not a magic Square!");
        }
    }

第 1 步 -> int[] rowArr = a[row];

第二步->

int[] rowArr = a[row];
System.out.print("row "+row+": ");
for(col=0; col<rowArr.length; col++)

当你调用 return rowsEqTargetSum(null, 0, sum, sum, sum, sum); 时会导致 java.lang.NullPointerException;

【讨论】:

  • 您创建的此方法具有不同的行为,因为它不强制提供的参数在每行中包含相同数量的列。在这种情况下,参数 n 的目的是确保输入始终具有与行数相同的列数,否则将出现空指针异常。可以捕获空指针异常以产生更有用的错误,例如无效参数异常,但如果传递的参数不是正方形,则此方法应抛出异常。
  • 其实我还没有到重点来避免NullPointerException。与其一口气理解整个问题,不如其他人指出的那样,我的建议是理解异常并从那里开始工作。您不应该对所有步骤进行代码可视化,而是一次修改它们
  • 我不知道你从哪里得到“你不应该对所有步骤进行代码可视化,而是一次修改它们”的想法,但这不是一个容易辩护的观点,因为它没有留出任何并发空间,正如您将在 GPU 开发中看到的那样,很快就会在主流开发中看到,因为我们面临着 60 多个核心处理器。
  • true 有不同的方法来提供解决方案,但首先您应该学习调试并分解为步骤。您所说的对于经验丰富的开发人员来说是正确的,但对于第一次编码人员来说却不是。而且OP绝对不是老手。是的,这是个人观点,我不会为它辩护为一种万无一失的方法。
  • 我在声明空指针异常时的错误,我的意思是 IndexOutOfBounds 异常。我的大脑并发问题,哈哈。
【解决方案2】:

你的方法不是问题。这是 G.I.G.O(Garbage in, Garbage out)的一个例子。您使用不正确的参数调用了您的方法。在这种情况下,rowsEqTargetSum 方法的第三个参数应该是 n,而是传递 n*(n*n+1)/2 (targetSum)。对于任何大于 1 的 n,此值将始终高于 n,因此会根据您的代码导致索引越界异常。

同样的问题在您的 rowsEqTargetSum(null, 0, sum, sum, sum, sum) 的尾部调用中再次发生,这是一个无限递归(您的下一个错误),因为在其中没有替代(完成)选项方法。如果您的代码被修复以调用具有正确参数的方法,我相信这将导致您的下一个堆栈溢出错误。

【讨论】:

  • 我改变了 return rowsEqTargetSum(null, 0, sum, sum, sum, sum);到 (a, 0, sum...) 并且我遇到了堆栈溢出错误,如果这是您正在谈论的错误 - 那是在 Acewin 指示的更改之后
  • 是的,堆栈溢出是由于无限递归。如果我正确理解您的代码,您应该“返回 sum == targetSum;”而不是进行递归。
猜你喜欢
  • 2016-02-09
  • 2016-04-15
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-30
  • 2014-03-01
相关资源
最近更新 更多