You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法在Main类调用Matrix的getMinor方法?报错方法未定义

问题:调用Matrix类方法报错"The method getMinor(Matrix) is undefined for the type Main"

我编写了Java代码,但在Main类的最后一行持续报错:"The method getMinor(Matrix) is undefined for the type Main."。我可以在Main类中调用Matrix类的其他方法,但无法调用getMinor和printMinor方法,请问我哪里出错了?

Matrix类代码

import java.util.ArrayList;

public class Matrix {

    private int n;
    private int m;
    private ArrayList<Double> Matrices = new ArrayList<Double>();
    
    public Matrix(int n, int m) {
        
        this.n = n;
        this.m = m;
        
        Matrices = new ArrayList<Double>(n*m);
        
    }
    
    public void printElement(int a, int b) {
        
        int index = (a-1)*m + b - 1;
        double element = Matrices.get(index);
        System.out.println(element);
        
    }
    
    public double getElement(int a, int b) {
        
        int index = (a-1)*m + b - 1;
        double element = Matrices.get(index);
        return element;
        
    }
    
    public void printMatrix() {
        
        for(int a = 1; a <= n; a++) {
            System.out.print("[");
            for(int b = 1; b <= m; b++) {
                if(b == 1) {
                    System.out.print(Matrices.get((a-1)*m + b - 1).toString());
                } else {
                    System.out.print("  " +Matrices.get((a-1)*m + b - 1).toString());
                }
            }
            System.out.println("]");
        }
        System.out.print("\n");
        
    }
    
    public int getRowNumber() {
        
        return n;
        
    }
    
    public int getColumnNumber() {
        
        return m;
        
    }
    
    public Matrix getMinor(Matrix Matrices) {
        
        Matrix minor = new Matrix(Matrices.getRowNumber() - 1, Matrices.getColumnNumber() - 1);
        
        for(int r = 1; r <= Matrices.getRowNumber(); r++) {
            for(int i = 1; i <= Matrices.getColumnNumber(); i++) {
                minor.addTo(r, i, Matrices.getElement(r+1, i+1));
            }
        }
        
        return minor;
        
    }
    
    public void printMinor(Matrix Matrices) {
        
        Matrix minor = getMinor(Matrices);
        minor.printMatrix();    
        
    }

    public void addTo(int a, int b, double value) {
        
        int index = (a-1)*m + b - 1;
        Matrices.add(index, value);
        
    }
    
}

Main类代码

public class Main{

    public static void main(String[] args) {
        
        Matrix myNew2Matrix = new Matrix(3, 3);
        myNew2Matrix.addTo(1,1,3);
        myNew2Matrix.addTo(1,2,2);
        myNew2Matrix.addTo(1,3,2);
        myNew2Matrix.addTo(2,1,1);
        myNew2Matrix.addTo(2,2,4);
        myNew2Matrix.addTo(2,3,4);
        myNew2Matrix.addTo(3,1,8);
        myNew2Matrix.addTo(3,2,2);
        myNew2Matrix.addTo(3,3,5);
        getMinor(myNew2Matrix); // 报错行
    }

}

问题原因及解决方法

核心错误原因

getMinor和printMinor是Matrix类的实例方法,不属于Main类。你直接在Main的main方法中调用getMinor(myNew2Matrix),相当于试图调用Main类中不存在的方法,因此报错。

修正方案

方案1:按现有代码正确调用实例方法

既然这两个方法是Matrix的实例方法,你需要通过Matrix对象来调用:

// 修改Main类的最后一行
Matrix minorMatrix = myNew2Matrix.getMinor(myNew2Matrix);
// 如果要打印余子式
myNew2Matrix.printMinor(myNew2Matrix);

方案2:优化方法设计(更合理)

当前getMinor方法的设计没必要额外传入Matrix参数,因为它的作用就是求当前矩阵的余子式。可以修改方法为无参:

// 修改Matrix类中的getMinor方法
public Matrix getMinor() {
    // 使用当前实例的行列数
    Matrix minor = new Matrix(this.n - 1, this.m - 1);
    // 调整循环边界,避免索引越界
    for(int r = 1; r <= this.n - 1; r++) {
        for(int i = 1; i <= this.m - 1; i++) {
            minor.addTo(r, i, this.getElement(r+1, i+1));
        }
    }
    return minor;
}

// 同步修改printMinor方法
public void printMinor() {
    Matrix minor = getMinor();
    minor.printMatrix();    
}

此时Main类中的调用会更简洁:

Matrix minorMatrix = myNew2Matrix.getMinor();
myNew2Matrix.printMinor();

额外BUG修复

你的addTo方法会触发IndexOutOfBoundsException,因为ArrayList.add(index, value)要求索引必须小于等于当前列表的大小。初始化Matrix时,只是设置了ArrayList的初始容量,实际元素数量为0。建议修改初始化逻辑和addTo方法:

// 修改Matrix构造方法
public Matrix(int n, int m) {
    this.n = n;
    this.m = m;
    Matrices = new ArrayList<>(n*m);
    // 预先填充默认值,避免索引越界
    for(int i = 0; i < n*m; i++) {
        Matrices.add(0.0);
    }
}

// 修改addTo方法为set操作
public void addTo(int a, int b, double value) {
    int index = (a-1)*m + b - 1;
    Matrices.set(index, value);
}

内容的提问来源于stack exchange,提问作者refik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 19:38:09