【问题标题】:Exception in thread "main" java.lang.IllegalArgumentException: For input string: " false"线程“main”java.lang.IllegalArgumentException 中的异常:对于输入字符串:“false”
【发布时间】:2020-01-02 17:25:28
【问题描述】:
enter code here
package anotherExample

object StringSplitter {
  def computePercentTrue(line: String): Double = {
    val splits: Array[String] = line.split(";")
    var totalCount: Double = 0
    //println("Hi!")
    var trueCount: Double = 0
    for (value <- splits) {
      //println("Hello!")
      val valueAsBoolean: Boolean = value.toBoolean
      //println(3)
      if (valueAsBoolean) {
        trueCount += 1
      }
      totalCount += 1
    }
    trueCount / totalCount
  }

  def main(args: Array[String]): Unit = {
    val testInput = "true; false; true; true; true"
    val percentTrue = computePercentTrue(testInput) // expecting 0.8
    println("Percentage true == " + percentTrue)
  }


}

嗨,所以这段代码的重点是一串布尔值(真/假)并用分号分隔,我试图返回真值的百分比。我不明白错误消息,而且我是 Scala 新手,所以有人可以解释发生了什么吗?我收到此错误消息:

Exception in thread "main" java.lang.IllegalArgumentException: For input string: " false"
    at scala.collection.immutable.StringLike.parseBoolean(StringLike.scala:327)
    at scala.collection.immutable.StringLike.toBoolean(StringLike.scala:289)
    at scala.collection.immutable.StringLike.toBoolean$(StringLike.scala:289)
    at scala.collection.immutable.StringOps.toBoolean(StringOps.scala:33)
    at anotherExample.StringSplitter$.$anonfun$computePercentTrue$1(StringSplitter.scala:11)
    at anotherExample.StringSplitter$.$anonfun$computePercentTrue$1$adapted(StringSplitter.scala:9)
    at scala.collection.IndexedSeqOptimized.foreach(IndexedSeqOptimized.scala:36)
    at scala.collection.IndexedSeqOptimized.foreach$(IndexedSeqOptimized.scala:33)
    at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:198)
    at anotherExample.StringSplitter$.computePercentTrue(StringSplitter.scala:9)
    at anotherExample.StringSplitter$.main(StringSplitter.scala:23)
    at anotherExample.StringSplitter.main(StringSplitter.scala)

【问题讨论】:

  • “false”包含一个前导空格。
  • 谢谢,当您使用 .split 时,我没有意识到空格很重要
  • 使用 toBoolean 转换为布尔值时,空格很重要,因此格式解析错误(请注意有用的堆栈跟踪和消息中的特定值)。斯普利特不在乎,完全按照它的说法去做。考虑一个minimal SSCCE:“false”.toBoolean
  • 一旦确定了该问题,Y 问题可能是:“如何分割字符并消除周围的空白?”
  • 你可以使用修剪val valueAsBoolean: Boolean = value.trim.toBoolean

标签: scala


【解决方案1】:

正如 @asanand 在他的评论中提到的,您应该使用 trim。

Scala 2.13 中,您可以完全安全地进行操作(没有 Exception),使用这个:

stringValue.trim.toBooleanOption.getOrElse(false)

或与以前的版本:

Try(stringValue.trim.toBoolean).getOrElse(false)

请看这里:https://stackoverflow.com/a/54991592/2750966

顺便说一句,在 Scala 中总是尽量避免可变状态 vars。

这里是一个使用foldLeft的例子:

def computePercentTrue(line: String): Double = {
   val (trueCount, totalCount) = 
      line.split(";")
        .foldLeft((0.0, 0)){case ((count, total), value) => 
           (if(value.trim.toBooleanOption.getOrElse(false))
               count + 1
            else 
               count
            , total + 1)
        } 
   trueCount / totalCount
}

【讨论】:

    【解决方案2】:

    使用正则表达式解决方案,您可以更宽容地处理格式错误的输入。

    def computePercentTrue(line: String): Double = {
      val vctr = "(true|false)".r.findAllMatchIn(line)
                               .map(_.group(1)=="true")
                               .toVector
      vctr.count(identity) / vctr.length.toDouble
    }
    
    computePercentTrue("true;; false;x; true=true -- true")
    //res0: Double = 0.8
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-14
      • 1970-01-01
      • 1970-01-01
      • 2014-05-27
      • 2014-06-07
      相关资源
      最近更新 更多