无法解析符号

时间:2019-10-07 08:02:32

标签: java compiler-errors

我尝试了这个,但是它显示了这个错误:

  

无法解析符号i

public Incident getNextIncident() {
    if (!incidentQueue.isEmpty()) {
        Incident i = incidentQueue.element();
        incidentQueue.remove();
    }
    return i;
}

4 个答案:

答案 0 :(得分:2)

说明

您不能在声明的范围内外部使用变量。

您在i的内部{strong}内部创建了if,因此if结束时它将被销毁。您必须先创建i if。例如:

public Incident getNextIncident() {
    Incident i = null;
    if (!incidentQueue.isEmpty()) {
        i = incidentQueue.element();
        incidentQueue.remove();
    }
    return i;
}

然后,您就可以在外面使用它了。


处理空箱

但是您需要知道它是null,如果它没有输入if,则应该处理这种情况:

public Incident getNextIncident() {
    Incident i = null;
    if (!incidentQueue.isEmpty()) {
        i = incidentQueue.element();
        incidentQueue.remove();
    }

    if (i == null) {
        // TODO Handle this case ...
    }

    return i;
}

请注意,您也可以直接从if内部返回,而无需在外部进行:

public Incident getNextIncident() {
    if (!incidentQueue.isEmpty()) {
        Incident i = incidentQueue.element();
        incidentQueue.remove();
        return i;
    }

    // TODO Handle this case ...
}

或者,以一种早期返回的方式(首选样式)稍作重写:

public Incident getNextIncident() {
    if (incidentQueue.isEmpty()) {
        // TODO Handle this case ...
    }

    Incident i = incidentQueue.element();
    incidentQueue.remove();
    return i;
}

投票

请注意,队列中有一个方法的常用名称,该名称会删除并返回第一个值poll。而且,如果您的队列恰好是Java库中的队列(而不是自定义类),那么它也已经具有这种方法。

请参阅Queue#poll的文档:

  

检索并删除此队列的开头,如果此队列为空,则返回null。

因此,除了创建此方法之外,您还可以这样做

Incident head = incidentQueue.poll();
// instead of
Incident head = incidentQueue.getNextIncident();

可选

让我为您提出一种现代的方式来处理由于队列为空而无法返回值的情况。

旧的方式是返回null,但这有很多缺点。从Java 8开始,我们已经专门为此创建了Optional(请参见其documentation)。

public Optional<Incident> poll() {
    if (incidentQueue.isEmpty()) {
        return Optional.empty();
    }

    Incident head = incidentQueue.element();
    incidentQueue.remove();
    return Optional.of(head);
}

注意

我还建议将事件变量重命名为incidenthead而不是i。不要缩写变量名,除非它们是众所周知的(例如http)或常见的模式(例如ijk代表循环或{{1}) },a用于数学运算)。 b在这里只会造成混乱,因为它通常在循环中用作索引变量i

答案 1 :(得分:1)

您正在复制现有的Queue功能。您的代码(如果可行)等效于

public Incident getNextIncident() {
    return incidentQueue.poll();
}

答案 2 :(得分:0)

您在i条件内声明了if,因此编译器说在return i;行中,它可能不知道i是什么。

您必须在if之前声明它:

public Incident getNextIncident() {
    Incident i = null;
    if (!incidentQueue.isEmpty()) {
        i = incidentQueue.element();
        incidentQueue.remove();
    }
    return i;
}

答案 3 :(得分:0)

应该只是一个小问题。您已经在if块内声明了Incident对象。意味着它只停留在那里。到达return i;部分后,它基本上不存在。您必须在if块外部声明Incident i