Java JShell 支持运行 Java 语句、变量、方法和类定义、imports 和表达式语句,我们统称这些 Java 代码称为片段 ( snippets )。因此,Java Shell 的功能还是蛮齐全的。
本章节我们将会介绍一下内容
- 尝试一些简单的 Java 片段。
- 改变定义
- 向前引用
- 异常处理
Tab
键自动完成片段- 片段转换
尝试一些简单的 Java 片段
将 Java 代码片段输入 JShell 回车后会立即运行,会即时显示有关结果,执行的操作以及发生的任何错误的反馈。你可以在 JShell 中输入本章节的任何片段,与我们一起遨游 JShell。
如果在启动 JShell 时添加 verbose 选项 ( -v
),可以获得最大的可用反馈提示。
[yufei@www.twle.cn ~]$ jshell -v | 欢迎使用 JShell -- 版本 10.0.2 | 要大致了解该版本, 请键入: /help intro jshell>
然后在 JShell 中输入以下语句,查看输出结果
jshell> int x = 30; x ==> 30 | 已创建 变量 x : int
可以看到,当我们输入按下回车键后,就会立即显示结果。
上面这个范例结果告诉我们,已经创建了一个变量 x
,类型为 int
,并且赋值为 30
。 会显示这么详细的结果是因为我们启用了 -v
选项,JShell 会输出当前发生了什么。
这种信息性的消息是以竖条 ( |
) 开始的,告诉了我们刚刚创建的变量名称和变量类型。
注意
JShell 会自动补全末尾的分号,所以,即使我们没有输入,也不会发生错误。
当输入的表达式没有赋值给变量时,JShell 会自动创建一个临时变量,以便接下来的代码中可以引用该值。下面的范例显示了表达式和方法结果的临时值。这个范例还演示了在代码段需要多行输入完成时使用的延续提示( ...>
)
jshell> 2 + 2 $2 ==> 4 | 已创建暂存变量 $2 : int jshell> String twice(String s) { ...> return s +s; ...> } | 已创建 方法 twice(String) jshell> twice("简单教程") $4 ==> "简单教程简单教程" | 已创建暂存变量 $4 : String
改变定义
在试验代码时,我们经常会发现变量,方法或类的定义没有按照我们希望的方式执行。在 JShell 中,我们可以通过重新输入新的定义可以来覆盖之前的定义。
例如,下面的定义将覆盖先前的定义
jshell> String twice(String s) { ...> return "Twice:" + s; ...> } | 已修改 方法 twice(String) | 更新已覆盖 方法 twice(String) jshell> twice("简单教程") $6 ==> "Twice:简单教程" | 已创建暂存变量 $6 : String jshell>
观察我们重新定义 twice(String s)
的返回结果,由第一次创建时的 已创建 方法 twice(String)
变成了
| 已修改 方法 twice(String) | 更新已覆盖 方法 twice(String)
从这条消息中可以看出,我们的覆写已经生效了,因为覆写的方法和之前的方法有着相同的签名,所以调用方式仍然有效。
当然了,我们还可以以不兼容的方式覆写定义。例如下面的示例,我们把 x
变量的类型从 int
更改为 String
jshell> int x = 45 x ==> 45 | 已修改 变量 x : int | 更新已覆盖 变量 x : int jshell> String x = "简单教程" x ==> "简单教程" | 已替换 变量 x : String | 更新已覆盖 变量 x : int jshell>
注意观察两次覆写的不同,第一次保持了变量的签名不变,因此提示信息是 已修改 变量 x : int
,而第二次我们更改了 x
变量的类型,因此提示信息变成了 已替换 变量 x : String
,也就是由 修改 变成了 替换
改变提示信息的模式
刚刚我们能看到提示信息,是因为启动 JShell 添加了 -v
选项,这个选项会输出很多有用的消息。
如果你有需要更改提示信息的模式,可以使用 /set feedback
命令设置提示信息的级别和格式。例如使用 /set feedback concise
设置不显示信息提示。
如果需要在不同的 JShell 之间相互拷贝代码,那么你可能更喜欢没有提示且只有错误反馈的反馈模式,如果是,则输入 /set feedback silent
命令
silent
和 concise
之间的区别主要是如何对待出错,前者会显示出错信息,后者什么也不会输出
需要说明的是 /set feedback
有四种模式,你可以使用 /set feedback
查看具体的选项
jshell> /set feedback | /set feedback concise | | 可用的反馈模式: | concise | normal | silent | verbose
模式 | 说明 |
---|---|
concise | 简要模式,不输出任何正常信息,但会输出错误信息 |
normal | 会输出代码片段的执行结果,但不会输出提示信息 |
slient | 错误信息也不会输出 |
verbose | 输出详细的信息,包括提示信息 |