我有一個嚴肅的問題困擾我很久了。我最近被分配在 CodingBat 上執行 Logic-1 > alarmClock,我想出了以下代碼作為我的解決方案:
public String alarmClock(int day, boolean vacation) {
if (!vacation) {
if (0 < day && day != 6) {
return "7:00";
} else {
return "10:00";
}
}
if (vacation) {
if (0 < day && day != 6) {
return "10:00";
} else{
return "off";
}
}
}
當我運行這段代碼時,我不斷收到這條訊息“編譯問題:缺少回傳陳述句行:18”。在調整了代碼并嘗試了其他解決方案后,我放棄了,最終問朋友他們是如何解決他們向我展示這段代碼的代碼的:
public String alarmClock(int day, boolean vacation) {
if (!vacation) {
if(0 < day && day != 6)
return "7:00";
else
return "10:00";
} else if (day > 0 && day != 6)
return "10:00";
else
return "off";
}
他給了我一些建議,但我一直很好奇的是為什么第二個示例沒有大括號。我被教導 if 陳述句要使用大括號來包含塊內的代碼主體,此時我很困惑為什么第二個代碼在某些 if/else 陳述句旁邊沒有任何大括號.
uj5u.com熱心網友回復:
仔細看第一個例子。您有 1 個方法,并且所有 return 陳述句都在一些 if 塊中使用。
{
if ()
{
return
}
if ()
{
return
}
}
那邊有什么問題?如果這兩個如果是假的會發生什么?該方法實際上將回傳什么?您在那里缺少第三個回傳陳述句......就在最后一個'}'之前。
所以,讓我們來看第二個例子。您有 1 個帶有條件的 if 陳述句,1 個 else if 和最后的“else”檢查。
{
if ()
{
return
}
else if ()
{
return
}
else
return
}
它通過 else 檢查涵蓋了這種情況下的所有場景。
要理解這一點,想象一下:
private static String getDayName(int day)
{
if (day == 1) {
return "Monday";
}
if (day == 2) {
return "Tuesday";
}
// What would returned if the day is equal to 3?
}
因此,您的代碼應該涵蓋所有場景。通過一些更改,您可以避免像這樣的額外檢查:
public String alarmClock(int day, boolean vacation){
if (0 < day && day != 6){
return vacation ? "10:00" : "7:00";
}
return "off";
}
Ps 我不確定當天的支票,我用你的條件而不是第二個例子
uj5u.com熱心網友回復:
當您替換if (vacation)為else每個控制流時,都會回傳一個值。事實上,這是一個編譯器限制:它看到if (vacation)并假設當條件不成立時(可以這么說),你到達方法的末尾時沒有 areturn的值。
編譯器不是那么聰明,以至于在這種情況下第一個if (!vacation)會導致回傳值。
public String alarmClock(int day, boolean vacation) {
if (!vacation) {
if (0 < day && day != 6) {
return "7:00";
} else {
return "10:00";
}
} else {
if (0 < day && day != 6) {
return "10:00";
} else {
return "off";
}
}
}
該代碼假定日值為 0 .. 6,其中 0 可能是星期日,而 6 可能是星期六。DayOfWeek列舉更好
。DayOfWeek.getValue()將交付 ISO-8601 標準,從 1(星期一)到 7(星期日)。
public String alarmClock(DayOfWeek day, boolean vacation) {
if (!vacation) {
return switch (day) {
case SATURDAY, SUNDAY -> "10:00";
default -> "7:00";
};
} else {
return switch (day) {
case SATURDAY, SUNDAY -> "off";
default -> "10:00";
};
}
}
switch 運算式相對較新,但在這里很理想。
(您也可以記住本地化的WeekFields.)
uj5u.com熱心網友回復:
當任何塊只有一個陳述句(if、else、any loop 等)時,{} 的使用變得可選。如果會有多個陳述句,那么我們將不得不使用 {}。
uj5u.com熱心網友回復:
如果只有一個陳述句,則不需要使用{and }。但這可能很危險。蘋果過去曾遇到過這個問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/517963.html
