Java 无法解析符号

Java 无法解析符号,java,compiler-errors,Java,Compiler Errors,我尝试了这个,但它显示了这个错误: 无法解析符号i 在if条件中声明i,因此编译器在返回i的行中声明i;它可能不知道我是什么 如果出现以下情况,您必须在 在if条件中声明i,因此编译器在返回i的行中声明i;它可能不知道我是什么 如果出现以下情况,您必须在 这应该只是个小问题。您已经在if块中声明了事件对象。这意味着它只停留在那里。当你到达我的归宿;在某种程度上,它根本不存在。您必须在if块之外声明事件i。这应该只是一个小问题。您已经在if块中声明了事件对象。这意味着它只停留在那里。当你到达我的归

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

无法解析符号i

在if条件中声明i,因此编译器在返回i的行中声明i;它可能不知道我是什么

如果出现以下情况,您必须在

在if条件中声明i,因此编译器在返回i的行中声明i;它可能不知道我是什么

如果出现以下情况,您必须在


这应该只是个小问题。您已经在if块中声明了事件对象。这意味着它只停留在那里。当你到达我的归宿;在某种程度上,它根本不存在。您必须在if块之外声明事件i。

这应该只是一个小问题。您已经在if块中声明了事件对象。这意味着它只停留在那里。当你到达我的归宿;在某种程度上,它根本不存在。您必须在if块之外声明事件i。

解释
不能在声明变量的作用域之外使用该变量

你在if中创建了i,所以一旦if结束它就会被销毁。您必须在if之前创建i。例如:

public Incident getNextIncident() {
    Incident i = null;
    if (!incidentQueue.isEmpty()) {
        i = incidentQueue.element();
        incidentQueue.remove();
    }
    return i;
}
然后你可以在外面用,就像你看到的

处理空箱 但您需要注意,如果未输入if,则为null,您应处理此情况:

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库的队列,而不是自定义类,那么它也已经有了这样的方法

见以下文件:

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

因此,您不必创建此方法,只需

Incident head = incidentQueue.poll();
// instead of
Incident head = incidentQueue.getNextIncident();
可选择的 让我向您推荐一种现代方法来处理由于队列为空而无法返回值的情况

旧式的方法是返回null,但这有许多缺点。从Java8开始,我们就有了可选的,它的创建正是为了查看它

笔记 我还建议将事件变量重命名为incident或head,而不是I。不要缩写变量名,除非它们通常被称为http,或者是常见的模式,如循环的i、j、k或数学运算的a、b。这里我只会感到困惑,因为它通常在循环中用作索引变量int i。

解释
不能在声明变量的作用域之外使用该变量

你在if中创建了i,所以一旦if结束它就会被销毁。您必须在if之前创建i。例如:

public Incident getNextIncident() {
    Incident i = null;
    if (!incidentQueue.isEmpty()) {
        i = incidentQueue.element();
        incidentQueue.remove();
    }
    return i;
}
然后你可以在外面用,就像你看到的

处理空箱 但您需要注意,如果未输入if,则为null,您应处理此情况:

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库的队列,而不是自定义类,那么它也已经有了这样的方法

见以下文件:

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

因此,您不必创建此方法,只需

Incident head = incidentQueue.poll();
// instead of
Incident head = incidentQueue.getNextIncident();
可选择的 让我向您推荐一种现代方法来处理由于队列为空而无法返回值的情况

旧式的方法是返回null,但这有许多缺点。从Java8开始,我们就有了可选的,它的创建正是为了查看它

笔记
我还建议将事件变量重命名为incident或head,而不是I。不要缩写变量名,除非它们通常被称为http,或者是常见的模式,如循环的i、j、k或数学运算的a、b。在这里我只会感到困惑,因为它通常被用作循环中的索引变量int i。

您是在白白复制现有的队列功能。如果代码有效,则它与

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

您正在徒劳地复制现有队列功能。如果代码有效,则它与

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

当incidentQueue为空时,您期望i是什么?因为您试图在其范围外使用变量i。变量i仅在if块内的范围内。当你试图归还它时,它已经不存在了。incidentQueue是什么类?不能在声明变量的作用域之外使用该变量。你在if中创建了i,所以一旦if结束它就会被销毁。您必须在if之前创建i。例如,事件i=null;然后在if中赋值为i=。。。。然后你可以在外面用。但是您需要知道,如果没有,那么它是空的
如果不输入if,你应该处理这个案子。那么我需要I吗?以及如何返回事件?当incidentQueue为空时,您希望我是什么?因为您试图在其范围外使用变量i。变量i仅在if块内的范围内。当你试图归还它时,它已经不存在了。incidentQueue是什么类?不能在声明变量的作用域之外使用该变量。你在if中创建了i,所以一旦if结束它就会被销毁。您必须在if之前创建i。例如,事件i=null;然后在if中赋值为i=。。。。然后你可以在外面用。但是你需要知道,如果它没有输入if,那么它是空的,你应该处理这个问题。那么我需要I吗?如何返回事件?必须是事件i=null;,否则,编译器将投诉事件i=null;,若并没有,编译器将抱怨Hanks。但是,如果队列为空,该方法是否可能什么都不做?那么您必须返回一些内容。旧的方式是返回null。然后,如果foo==null,用户可以检查这种情况。。。。现代风格将是使用可选的。这正是它的用途。所以您的返回类型是可选的,并且您返回Optional.empty。如果有值,则返回Optional.ofincident。然后用户可以使用result.isEmpty和类似的方法进行检查。更新了答案谢谢。但是,如果队列为空,该方法是否可能什么都不做?那么您必须返回一些内容。旧的方式是返回null。然后,如果foo==null,用户可以检查这种情况。。。。现代风格将是使用可选的。这正是它的用途。所以您的返回类型是可选的,并且您返回Optional.empty。如果有值,则返回Optional.ofincident。然后用户可以使用result.isEmpty和类似的方法进行检查。更新了答案