4 回答

TA貢獻1853條經驗 獲得超9個贊
解釋
您不能在聲明的范圍之外使用變量。
你i 在里面創建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();
選修的
讓我向您建議一種現代方法來處理由于隊列為空而無法返回值的情況。
老式的方式是 return null,但這有很多缺點。從 Java 8 開始,我們就Optional專門為此創建了它(請參閱其文檔)。
public Optional<Incident> poll() {
if (incidentQueue.isEmpty()) {
return Optional.empty();
}
Incident head = incidentQueue.element();
incidentQueue.remove();
return Optional.of(head);
}
筆記
我還建議將事件變量重命名為incidentorhead而不是i. 不要縮寫變量名稱,除非它們是眾所周知的(例如http)或者是常見模式(例如i, j, kfor 循環或a,b用于數學運算)。i只會在這里令人困惑,因為它通常用作int i循環中的索引變量。

TA貢獻1843條經驗 獲得超7個贊
您Queue
毫無意義地復制現有功能。您的代碼(如果有效)相當于
public Incident getNextIncident() { return incidentQueue.poll(); }

TA貢獻1840條經驗 獲得超5個贊
i您在條件內聲明if,因此編譯器表示該行中return i;它可能不知道是什么i。
您必須在以下之前聲明它if:
public Incident getNextIncident() {
Incident i = null;
if (!incidentQueue.isEmpty()) {
i = incidentQueue.element();
incidentQueue.remove();
}
return i;
}

TA貢獻1775條經驗 獲得超11個贊
這應該只是一個小問題。您已在 if 塊內聲明了 Incident 對象。這意味著它只留在那里。當你到達該return i;
部分后,它基本上不存在。您必須Incident i
在 if 塊外部聲明。
添加回答
舉報