请按照以下步骤重现:
创建一个带有某种错误的“.jsh”脚本(缺少导入、语法错误等)
打开一个
jshell
/open
错误的脚本该
/open
命令将静默完成。该脚本中声明的元素不会在当前命名空间中。
如果加载了错误的脚本,有没有办法强制jshell
吐出错误及其在脚本中的位置?将反馈级别设置为verbose
不会改变任何内容。
jshell 在启动时导入了很多类,并且任何后续片段(即使从文件加载)都可以使用它们,因此这里可以处理很少的丢失导入。--no-startup 可用于禁用此行为。
这个问题似乎与 JShell 的“前向引用”特性有关:当方法或类型声明引用仍未定义的变量或方法时,JShell 仅检查语法正确性并延迟方法的编译。类型。在交互模式下,它会打印一条有用的消息,例如“方法 x 引用未定义的方法 y,并且在定义方法 y 之前无法调用”。但是,当启动脚本运行时,该消息不会打印出来,而且在许多情况下脚本什么也不执行,这非常令人困惑。我还没有找到启用打印该消息的方法。
挑剔的人可能会说这个错误/功能使 JShell 对于“真正的”脚本应用程序毫无用处,我倾向于同意。
我建议在脚本执行期间禁用“前向引用”功能。为了使前向引用仍然可能,整个脚本应该被认为是一个大片段。这也将消除 line-numbers-per-snippet 的问题,这对于从脚本解析的代码毫无意义。