我正在尝试远程调试scala项目.无论是执行程序(内置和SBT执行)和我的调试器(的IntelliJ)是局部的,但因为我不希望使用的IntelliJ,使用远程调试会话建立似乎为调试方便最简单的选择.
该程序以以下选项启动:
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005
Run Code Online (Sandbox Code Playgroud)
它在发布时成功挂起,我可以成功连接我的调试器.我可以设置断点并逐步执行代码,但问题是未捕获的异常会终止调试会话并断开调试器的连接,从而无法调试.这是默认行为是asburd,所以我必须做错事.
Intellij的控制台显示:
Connected to the target VM, address: 'localhost:5005', transport: 'socket'
Disconnected from the target VM, address: 'localhost:5005', transport: 'socket'
Run Code Online (Sandbox Code Playgroud)
在执行或调试方面,我是否缺少某些东西?
编辑:添加一个堆栈跟踪,我在我的主类中抛出新的异常("what"):
[error] java.lang.Exception: what
[error] at travellr.application.prophet.Prophet$.main(Prophet.scala:80)
[error] at travellr.application.prophet.Prophet.main(Prophet.scala)
[error] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[error] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
[error] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
[error] at java.lang.reflect.Method.invoke(Method.java:597)
[error] at scala.tools.nsc.util.ScalaClassLoader$$anonfun$run$1.apply(ScalaClassLoader.scala:81)
[error] at scala.tools.nsc.util.ScalaClassLoader$class.asContext(ScalaClassLoader.scala:24)
[error] at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.asContext(ScalaClassLoader.scala:86)
[error] at scala.tools.nsc.util.ScalaClassLoader$class.run(ScalaClassLoader.scala:81)
[error] at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.run(ScalaClassLoader.scala:86)
[error] at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:83)
[error] at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)
Run Code Online (Sandbox Code Playgroud) 我在我的代码中导致了一个更难找到我会喜欢的错误,以及我希望将来可以避免的一些错误.我预计Scala编译器会警告我我的错误(除非我遗漏了什么).
我把它减少到了琐碎的情况:
Vector.maybeGetVector match {
case v:Vector => true
case _ => false
}
case class Vector(x:Int, y:Int)
object Vector {
def maybeGetVector : Option[Vector] = Some(new Vector(1,2))
}
Run Code Online (Sandbox Code Playgroud)
我使用的唯一的原因wildcard,而不是None对整个秋季的是,我只是想以匹配返回的亚型Option.
我期待编译器警告,因为很容易推断第一个case语句包含无法访问的代码.Option[Vector]不能是一个子类型Vector.
奇怪的是,如果我添加以下case语句:
case i:Int => false
Run Code Online (Sandbox Code Playgroud)
它引发了一个错误并告诉我这Option[Vector]是必需的.
有没有办法在命名约定之外以这种方式防止程序员错误.唯一可以匹配的东西Option是Some/None/null.我觉得我错过了一些明显的东西.