Search code examples
scalaapache-sparktypechecking

Type checking on user input Scala Spark


I'm trying to do a type checking on an input that the user insert, but I don't know ho to do. My code is:

for(iteration<- 0 to 19) {
      print(movieRecommended(iteration))
      var personalRate = scala.io.StdIn.readDouble()
      if(Try(personalRate.toInt).isSuccess){
        while((personalRate > 5 || personalRate < 1) || personalRate % 0.5 != 0) {
          println("Error: respect the parameters")
          print(movieRecommended(iteration))
          personalRate = scala.io.StdIn.readDouble()
        }
      }
      else println("Error")
    ratingArr(iteration) = personalRate
    }

But when I try to give a string input like "a" I receive this error:

Exception in thread "main" java.lang.NumberFormatException: For input string: "a"
    at java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2054)
    at java.base/jdk.internal.math.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
    at java.base/java.lang.Double.parseDouble(Double.java:549)
    at scala.collection.immutable.StringLike.toDouble(StringLike.scala:321)
    at scala.collection.immutable.StringLike.toDouble$(StringLike.scala:321)
    at scala.collection.immutable.StringOps.toDouble(StringOps.scala:33)
    at scala.io.StdIn.readDouble(StdIn.scala:167)
    at scala.io.StdIn.readDouble$(StdIn.scala:162)
    at scala.io.StdIn$.readDouble(StdIn.scala:241)
    at CollaborativeFilteringUserBasedALS$.$anonfun$askUserInput$1(CollaborativeFilteringUserBasedALS.scala:192)
    at scala.collection.immutable.Range.foreach$mVc$sp(Range.scala:158)
    at CollaborativeFilteringUserBasedALS$.askUserInput(CollaborativeFilteringUserBasedALS.scala:189)
    at CollaborativeFilteringUserBasedALS$.topRated(CollaborativeFilteringUserBasedALS.scala:133)
    at CollaborativeFilteringUserBasedALS$.main(CollaborativeFilteringUserBasedALS.scala:284)
    at CollaborativeFilteringUserBasedALS.main(CollaborativeFilteringUserBasedALS.scala)

Someone can explain me what I'm doing wrong?


Solution

  • You can read the input as a string using scala.io.StdIn.readLine() then try to parse it to Int and use pattern matching to handle case for valid int and for error.

    Something like this :

    for (iteration <- 0 to 19) {
      var personalRate = scala.io.StdIn.readLine()
    
      Try(personalRate.toInt).toOption match {
        case Some(rate) => {
          println(rate)
          // your logic for int 
        }
        case _ => println("Error")
        
       //...
      }
    }