jshell 是 jdk 9+ 自带的交互式 java repl 工具,支持快速验证语法和 api;需输入完整语句或表达式才执行,不完整时提示符变为 ...,可按 ctrl+c 取消;变量须声明类型或用 var,方法可省略 public/static;需显式 import 非 java.lang 包;内置命令以 / 开头,如 /exit、/save 等。

jshell 是 JDK 9+ 自带的交互式 Java REPL 工具,能直接运行单行或小段代码,不用写 class、public static void main、编译再执行——适合快速验证语法、API 行为或调试表达式。
启动 jshell 后输代码没反应?检查是否误按了回车就结束
jshell 不是“输入一行 → 回车 → 立刻执行”,它会等待你输入完整语句(比如 int x = 1;)或表达式(比如 2 + 3),但如果你只输一半(如 String s = "hello,缺右引号),它会等你补全,光按回车只会换行,不会报错也不会执行。
- 输入不完整时,提示符会变成
...(不是jshell>),这时继续补完再回车 - 想放弃当前输入,按
Ctrl+C清空缓冲区,回到jshell> - 输入完整语句后回车,jshell 才会解析并显示结果或变量名(如
s ==> "hello")
jshell 中怎么定义变量和方法?不能照搬 .java 文件写法
jshell 允许省略修饰符和分号(部分场景),但规则比普通 Java 松散也更隐晦:
- 变量声明必须有类型或用
var,不能裸写x = 1(会报错| Error:) - 方法定义要写全签名,但可以省略
public、static,例如:int add(int a, int b) { return a + b; }可直接运行 - 方法体里不能引用尚未定义的变量或方法,jshell 是顺序执行的,没有“提升”(hoisting)
- 类、接口、枚举也能定义,但一旦定义,就不能在同一个 session 里重定义同名类型(报
| Error: A class with name 'X' already exists.)
为什么 import 的类在 jshell 里找不到?默认没自动导入常用包
jshell 不会自动导入 java.util.* 或 java.time.* 这些常见包,哪怕你在 IDE 里写习惯了,这里必须显式 import:
立即学习“Java免费学习笔记(深入)”;
- 输入
import java.time.LocalDate;或import java.util.*;后才能用 - 可以用
/imports查看当前已导入项;用/reset会清掉所有导入、变量、方法,相当于重启 - 注意:
java.lang.*是唯一自动导入的包,所以String、System、Math直接可用 - 如果遇到
| Error: cannot find symbol,先查是不是漏了import,而不是怀疑代码逻辑
退出 jshell 或保存历史?别用 exit(),用 /exit 命令
jshell 的内置命令都以 / 开头,不是 Java 方法调用:
- 退出用
/exit,不是exit()(后者会被当表达式,报错| Error: cannot find symbol) - 查看历史命令用
/history,导出到文件用/save filename.jsh(保存的是可重放的 jshell 脚本,不是标准 .java) -
/list显示所有已定义的变量/方法/类;/drop 名称可删除某个定义(比如删错的方法) - 历史记录默认不跨 session 保存,除非手动
/save,关掉终端就丢了
真正容易卡住的地方,其实是 jshell 对“语句完整性”的判断比人直觉更严格——少个分号有时行,少个括号一定不行;而错误信息又只说 Error:,不提示缺什么。多试几次 /help 和 /list,比硬猜快得多。









