我正在撰寫一個 Scala 月份函式,該函式在呼叫時將回傳一個整數月份數。此函式正在通過編譯階段,但在運行時呼叫時拋出錯誤。
import java.time.Month
import java.util.Calendar
object Test {
val FINAL_MONTH_NBR = 12
def main(args: Array[String])
{
month()
}
def month(): Int = {
val month = System.getProperty("month")
if(month == null) {
Calendar.getInstance().get(Calendar.MONTH)
}
else {
val monthValue = Month.valueOf(month)
if (monthValue == Month.JANUARY) {
FINAL_MONTH_NBR
}
else {
monthValue.getValue - 1
}
}
}
}
這是拋出錯誤:java.lang.IllegalArgumentException:沒有列舉常量 java.time.Month.UNDEFINED錯誤在下面一行
val monthValue = Month.valueOf(month)
任何人都可以建議如何解決這個問題。
uj5u.com熱心網友回復:
我猜這一行是潛在的問題:
val month = System.getProperty("month")
您檢查該值是否為 null 并處理該情況,但如果系統屬性為foo呢?當您呼叫時,物件上Month.valueOf(month)沒有foo,因此您會收到錯誤訊息。
Scala 具有處理例外的有用功能,可以在這里提供幫助。考慮以下:
def month(): Int = {
val monthSystem: Either[Exception, Int] = try Right(System.getProperty("month").toInt) catch {
case e: Exception => Left(e)
}
val month: Either[Exception, Month] = monthSystem.map(m => Month.valueOf(m.toString))
val mSafe: Int = month fold(
(ex: Exception) => {
// see what went wrong
println(ex.getMessage)
// default case
Calendar.getInstance().get(Calendar.MONTH)
},
(m: Month) => m.getValue
)
if (mSafe == Month.JANUARY.getValue) FINAL_MONTH_NBR else mSafe - 1
}
將系統呼叫包裝在一個Either讓我們在一切順利的情況下捕獲結果,如果出現問題則捕獲例外。然后我們就可以map正常使用了。它是“右偏”,所以當我們映射結果時,它只是應用函式,就好像存在一個值一樣,即使拋出例外也是如此。通常你可能只是在 Scala 中將所有這些呼叫串在一起,但我已經將它們分開,以便更清楚地遵循。
一旦我們在我們想要呼叫的形式中獲得可能的值fold來處理這兩種情況。fold有兩個函式,一個處理可能的Exception情況,一個處理可能的Month情況。這里我們可以使用第一種方法來記錄任何問題并回傳一個默認值。
uj5u.com熱心網友回復:
改用月份名稱串列,如果它不屬于下面給出的串列,則對其進行設定。
def month(): Int = {
val month = System.getProperty("month")
val monthList = List("JANUARY","FEBRUARY","MARCH","APRIL","MAY","JUNE","JULY","AUGUST","SEPTEMBER","OCTOBER","NOVEMBER","DECEMBER")
if(!monthList.contains(month)) {
Calendar.getInstance().get(Calendar.MONTH)
}
else {
val monthValue = Month.valueOf(month)
if (monthValue == Month.JANUARY) {
FINAL_MONTH_NBR
}
else {
monthValue.getValue - 1
}
}
}
如果它解決了您的問題,請不要忘記選擇它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/331459.html
標籤:斯卡拉
上一篇:如何處理期貨的尾遞回
