【问题标题】:Java - object cannot be resolved (to a variable)Java - 无法解析对象(到变量)
【发布时间】:2016-01-15 19:34:17
【问题描述】:

起初很抱歉,如果不是一切都可以理解(我来自德国)。请试着理解我对java很陌生,可能犯了一些愚蠢的错误。我有两节课。一种带有构造函数和函数,一种带有菜单。

第 1 类(构造函数和函数):

public class Matrix {
    private float[][] matrix;
...
    public void createMatrix(int zei, int spa){
...
    public void printMatrix(){
        int x = 0;
        while (x < this.matrix.length){
            for (float elem : this.matrix[x]){
                System.out.printf("%10d", elem); 
            }
            x++;
            System.out.println();
        }
        System.out.println();
    }

第 2 类(菜单):

public class MenuMatrix{
    public static void menue(){
...
        if (m1 == null){
            Matrix m1 = new Matrix();
            m1.createMatrix(zei, spa);
        }
        else if (m2 == null){
            Matrix m2 = new Matrix();
            m2.createMatrix(zei, spa);
        }
        else{
            System.out.println("Which matrix do you want to replace?");
            m1.printMatrix();
            m2.printMatrix();
            int x = readInteger("Please choose matrix (1) or (2).");
...

我想确保只有 2 个此类对象可以存在。因此,我已经包括检查对象是否已经存在(m1/m2 == null)。有第一个错误。根据 if 子句,它告诉我“m1/m2 无法解析为变量”。另一个错误出现在 m1/m2.printMatrix() 行中。 Eclipse 说“无法解析 m1/m2”。 几个不同网站上的信息告诉我它应该以这种方式工作。希望你能告诉我问题到底出在哪里。

提前致谢。

【问题讨论】:

  • Java variable scope。在你的情况下,它甚至不是范围,你甚至没有声明 m1
  • 跟作用域无关,他的变量在声明之前就被引用了
  • 你在哪里声明m1/m2?它们还不存在。
  • 您的代码不完整。请发布完整版本,因为我们的眼睛可能会误解某些内容。无论如何,据我所知,您正在检查 m1 和 m2 而不考虑声明范围:您将它们声明并初始化到 IF..THEN..ELSE 中,但您尝试将它们检查到 IF 语句中。那是你想要达到的吗?如果是,您应该更改变量的范围。

标签: java object constructor


【解决方案1】:

您是在声明这些变量之前引用它们。

【讨论】:

  • 我知道,但其他网站说它应该以这种方式工作。我想检查它们是否已经存在。如果我在检查之前声明它们,我猜它是行不通的,因为它们现在已经存在。还是我的想法错了?
  • 要么你误解了他们写的内容,要么他们错了。它永远不会那样工作。
【解决方案2】:

查看您的代码示例:

if (m1 == null){
    Matrix m1 = new Matrix();
    m1.createMatrix(zei, spa);
}
else if (m2 == null){
    Matrix m2 = new Matrix();
    m2.createMatrix(zei, spa);
}

注意Matrix m1m2 变量是在第一次引用它们之后声明的。这些声明也在if 块的范围内,这将导致它们在执行流程退出块并继续到外部时被丢弃。

换句话说,当解析器到达if (m1 == null) 检查时,它注意到名称为m1m2 的变量还不存在。

您需要将声明移到if 语句的主体之外,以便在您尝试在给定范围内使用它们之前确保它们存在。快速搜索应该可以提供有关任何语言的变量范围规则的良好信息。

这里的一种可能方法是将变量转换为 MatrixMenu 类的私有成员,如下所示:

public class MatrixMenu {
    private Matrix m1;
    private Matrix m2;
    // ...
    if (m1 == null){
        m1 = new Matrix();
        m1.createMatrix(zei, spa);
    }
    else if (m2 == null){
        m2 = new Matrix();
        m2.createMatrix(zei, spa);
    }
    // ...

这是解决问题的一种可能方法。

PS:另一点是您应该考虑删除createMatrix 方法,而是将这些参数传递给Matrix 构造函数,以便在new 返回时立即生成有效/初始化的矩阵实例。换句话说:

public class Matrix {
    private float[][] values;
    public Matrix(int rows, int columns) {
        // throw exception if any argument is <= 0

        values = new float[rows][columns];
        // ...
    }
    // ...
}

【讨论】:

  • 谢谢,我会试试的。
  • @berl1n 请不要忘记接受您认为对解决问题最有帮助的答案。这就是我们在这里说“谢谢”的方式,让其他人知道您的问题有解决方案:)
  • 是的。我只需要检查几件事。它仍然无法按预期工作,但在更改其他一些内容后它可能会工作:)
猜你喜欢
  • 1970-01-01
  • 2011-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多