Scala “线程中的异常”;“主要”;java.lang.IllegalArgumentException:对于输入字符串:";假;

Scala “线程中的异常”;“主要”;java.lang.IllegalArgumentException:对于输入字符串:";假;,scala,Scala,正如@asand在他的评论中提到的,您应该使用trim 在Scala 2.13中,您可以完全安全地执行此操作(无异常),请使用以下命令: Exception in thread "main" java.lang.IllegalArgumentException: For input string: " false" at scala.collection.immutable.StringLike.parseBoolean(StringLike.scala:327) at scal

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

Scala 2.13中,您可以完全安全地执行此操作(无
异常
),请使用以下命令:

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)
或使用以前的版本:

stringValue.trim.toBooleanOption.getOrElse(false)
请看这里:

顺便说一句,在Scala中,始终尝试避免可变状态
var
s

下面是使用
foldLeft
的示例:

Try(stringValue.trim.toBoolean).getOrElse(false)
正如@asand在他的评论中提到的,您应该使用trim

Scala 2.13中,您可以完全安全地执行此操作(无
异常
),请使用以下命令:

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)
或使用以前的版本:

stringValue.trim.toBooleanOption.getOrElse(false)
请看这里:

顺便说一句,在Scala中,始终尝试避免可变状态
var
s

下面是使用
foldLeft
的示例:

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

使用正则表达式解决方案,您可以对格式不正确的输入更加宽容

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
}

使用正则表达式解决方案,您可以对格式不正确的输入更加宽容

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
}

“false”包含前导空格。谢谢,我没有意识到在使用时空格是重要的。使用toBoolean将拆分空格转换为布尔值时,拆分空格很重要,因此会出现格式分析错误(请注意消息中有用的stacktrace和特定值)。斯普利特并不在意,而且完全按照要求去做。考虑一个最小的SCSCE:“false”。ToBooLoNeN识别出Y问题的问题可能是:“如何在字符上拆分并消除周围的空白空间?”可以使用Trime>代码> ValueAuthBooLoe:Booale= Value.Trim. tobooLoo> < /Calp>“false”包含一个前导空间。我没有意识到在使用时空格是重要的。当使用toBoolean转换为布尔值时,拆分空格是重要的,因此会出现格式解析错误(请注意消息中有用的stacktrace和特定值)。斯普利特并不在意,而且完全按照要求去做。考虑一个最小的SCSCE:“false”。ToBooLoNeN识别出Y问题的一个问题可能是:“如何在一个字符上分割并消除周围的空白?”可以使用Trime>代码> ValueAuthBooLoe:Booal==Valtual.Timo.toBooLoo< <代码> >