4

我尝试编写一些 jshell 脚本。当抛出异常时,jshell 仍然继续执行下一行。

如何让我的脚本表现得更像普通的 java 程序?

编辑:我只是像运行它一样jshell SCR.jsh

使用throw new Exception()or1/0不会阻止执行下一行。

该脚本包含如下语句:

System.out.println(1/0)
System.out.println("foo")
/exit

我认为第二行是无法到达的。这就是我所期望的。但是异常被打印出来之后,foo也被打印出来了。

4

2 回答 2

5

根据我的理解,即使在抛出异常后仍执行脚本中所有行的原因jshell是因为它将您的脚本视为Snippet.

所有表达式都被接受为片段。这包括没有副作用的表达式,例如常量、变量访问和 lambda 表达式:

1
a
x -> x+1
(String s) -> s.length()

以及具有副作用的表达式,例如赋值和方法调用

System.out.println("Hello world");
new BufferedReader(new InputStreamReader(System.in))

因此,即使其中一个片段引发异常,其他片段也必须遵循Read-Eval-Print Loop (REPL) 模式。正如您自己回答的那样,将代码转换为语句块将其标记为单个Snippet,从而在抛出java.lang.ArithmeticException标记时将其完成。

尽管理想情况下,此类语句应改为定义为声明片段

声明片段(ClassDeclarationInterfaceDeclarationMethodDeclarationFieldDeclaration)是显式引入名称的片段,该名称可以被其他片段引用。

于 2017-09-22T06:51:55.393 回答
2

最后我想我找到了一个解决方法:

{
    System.out.println(1/0);
    System.out.println("foo");
}
/exit

现在它更接近于熟悉的 java 代码。

异常不仅按预期工作,而且在块内也需要分号。

于 2017-09-22T06:18:21.030 回答