【问题标题】:Cannot find symbol error when trying to use my own method [closed]尝试使用我自己的方法时找不到符号错误[关闭]
【发布时间】:2021-04-28 18:21:36
【问题描述】:

我有一个 Time 类,它有一个名为 lessThan 的比较方法

public boolean lessThan(Time t1, Time t2) {
    if (t1.getHours() > t2.getHours()) {
        return false;
    } else if (t1.getHours() == t2.getHours()) {
        if (t1.getMinutes() >= t2.getMinutes()) {
            return true;
        } else
            return true;
    } else
        return true;
}

我想在我的主类中使用此方法与传递给我的 Time 对象排序的 Time 对象进行比较。

public static void sortAppointments(ArrayList < Time > appointments) {
    Time val;
    for (int i = 0; i < appointments.size(); i++) {
        if (!lessThan(appointments.get(i), appointments.get(i + 1))) {
            val = appointments.get(i + 1);
            appointments.set(i + 1, appointments.get(i));
            appointments.set(i, val);
        }
    }
}

但是编译时出现找不到符号错误。我究竟做错了什么?如何在主类中使用自己的方法?

【问题讨论】:

  • 在用 Java 编写更多代码之前,您可能想了解 static 关键字的含义。
  • 另外,我建议您始终在 if-else 语句中使用大括号。尽管 Java 允许单行语句不使用大括号的语法,但它会导致难以发现的逻辑错误。
  • 您在哪里看到错误,错误是什么确切? (找不到哪个符号?)(我怀疑它是lessThan,但值得养成总是指定确切错误及其显示位置的习惯。)
  • @SoftwareEngineer,您可能想阅读Apple's notorious "goto fail" bug。虽然这涉及到 C 而不是 Java 代码,但原理是一样的。始终在ifelse 和循环体块周围使用花括号是防止出现此类错误的良好风格实践。就我个人而言,我只对作为else 语句的(整个)主体的if 语句例外。
  • 在 Java 上下文中特别相关,尽管现在比以前少了,但 the original Sun coding conventions for Java(从 1997 年开始)指定了相同的做法,即始终对 if 和 @987654333 使用花括号@body,除非else 的主体仅包含if 语句。他们将大括号的省略描述为“容易出错”。

标签: java object methods


【解决方案1】:

你写,

我有一个 Time 类,它有一个名为 lessThan 的比较方法

我想在我的主类中使用这个方法

,显然你试图用

来实现后者
            if( !lessThan( appointments.get( i ), appointments.get( i + 1 ) ) ) {

但是 lessThan() 的调用,就像它在主类的静态方法中出现的那样,将针对主类解析方法名称 lessThan。你想要的方法不存在,而是在Time 类中。

此外,您已将Time.lessThan(Time, Time) 实现为instance 方法,因此需要在Time 的实例上调用它,但它似乎没有使用该实例。如果它只接受一个参数,并评估调用它的实例是否小于参数,那么作为类Time 的实例方法会更有意义。就目前而言,如果它是静态的,该方法会更有用。

可以解决此问题的最小更改集是

  1. 制作方法static:

    // In class Time
    public static boolean lessThan( Time t1, Time t2 ) { // ...
    

  2. 在你的主类中调用它:

           if( !Time.lessThan( appointments.get( i ), appointments.get( i + 1 ) ) ) {
    

【讨论】:

  • 谢谢,这正是我所困惑的。
【解决方案2】:

要么使您的方法成为 static 辅助函数并以静态方式调用它,要么更改您的方法的签名以利用该方法在使用 this 时存在的 Time 实例,即

 public boolean lessThan( Time other ) {
    if (this.getHours() > other.getHours()) {
        return false;
    }
 }

然后在你的测试类中使用实例方法

boolean less = appointments.get(i).lessThan(appointments.get( i + 1 ));
 

对于列表排序,更简单的方法是让您的Time 实现Comparable&lt;Time&gt;,然后使用Collections.sort(list)

【讨论】:

  • 为什么主类中的辅助函数应该是静态的?
  • 您说您的lessThan 方法在问题中的Time 类中
  • 你可以忽略我之前说的,我在想别的东西,实际上并不想写。我想问的是,我明白你的实现为什么有效,但不明白我的实现有什么问题,为什么 java 给出的 lessThan 方法找不到符号错误?
  • 您获得cannot find symbol 的事实表明sortAppointments()lessThan 方法在不同的类中Time... 如果它们在同一个类中你会得到一个cannot be referenced from a static context 消息......所以你试图从Time 之外的方法访问Time 中的方法lessThan。假设您的sortAppointments 方法在MyClass 中,然后调用lessThan 就像这样做:MyClass.lessThanlessThanMyClass 中不存在,因此cannot find symbol - 这有意义吗?跨度>
  • 当您只写 methodName(arguments); 时,这意味着您正在当前实例上调用它,这意味着它等效于 this.methodName(arguments); 或者您想在类本身上调用它(以防万一static 方法),所以它相当于 ClasName.methodName(arguments);。由于在static 方法“没有this”内部,编译器只能假设您的意思是YourClass.lessThan(...),但要能够在类上调用lessThan,它必须是static
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-25
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多