我正在使用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)
我做错了什么?
答案 0 :(得分:5)
Byte
是一个8位有符号数。它可以包含介于-128和127之间的值。值173超出了可以存储在Byte
中的数字范围,因此会出现异常。请注意,错误消息正好告诉您(“值超出范围”)。
您可以做的是将其解析为Int
,然后将其转换为Byte
:
"173".toInt.toByte
从Int
到Byte
的转换只会切断Int
的前24位。您最终会得到Byte
,其值为-83。
答案 1 :(得分:1)
签名字节的范围是-128到127.
答案 2 :(得分:1)
"173"
超出范围:
"173".toByte //=> NumberFormatException
"127".toByte //=> 127
"-128".toByte //=> -128