scala中的java.lang.NumberFormatException

时间:2016-02-17 12:27:44

标签: scala

我正在使用Scala,并在尝试执行此代码时捕获此异常:

ipv4("63".toByte, "173".toByte, "67".toByte, "135".toByte)

def ipv4(a: Byte, b: Byte, c: Byte, d: Byte): Integer = {
    return a << 24 | b << 16 | c << 8 | d;
  }

例外:

[error] (run-main-0) java.lang.NumberFormatException: Value out of range. Value:"173" Radix:10
java.lang.NumberFormatException: Value out of range. Value:"173" Radix:10
        at java.lang.Byte.parseByte(Byte.java:151)
        at java.lang.Byte.parseByte(Byte.java:175)
        at scala.collection.immutable.StringLike$class.toByte(StringLike.scala:264)
        at scala.collection.immutable.StringOps.toByte(StringOps.scala:30)
        at Runner$$anonfun$main$1$$anonfun$apply$1.apply(Runner.scala:27)
        at Runner$$anonfun$main$1$$anonfun$apply$1.apply(Runner.scala:23)
        at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
        at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:186)
        at Runner$$anonfun$main$1.apply(Runner.scala:23)
        at Runner$$anonfun$main$1.apply(Runner.scala:21)
        at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
        at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:186)
        at Runner$.main(Runner.scala:21)
        at Runner.main(Runner.scala)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
[trace] Stack trace suppressed: run last compile:run for the full output.
java.lang.RuntimeException: Nonzero exit code: 1
        at scala.sys.package$.error(package.scala:27)

我做错了什么?

3 个答案:

答案 0 :(得分:5)

Byte是一个8位有符号数。它可以包含介于-128和127之间的值。值173超出了可以存储在Byte中的数字范围,因此会出现异常。请注意,错误消息正好告诉您(“值超出范围”)。

您可以做的是将其解析为Int,然后将其转换为Byte

"173".toInt.toByte

IntByte的转换只会切断Int的前24位。您最终会得到Byte,其值为-83。

答案 1 :(得分:1)

签名字节的范围是-128到127.

答案 2 :(得分:1)

"173"超出范围:

"173".toByte //=> NumberFormatException
"127".toByte //=> 127
"-128".toByte //=> -128