Java调试:用Scanner类赋值变量及jdb‘未识别命令’报错求助
刚好之前也遇到过类似的jdb调试问题,我来给你捋清楚怎么解决:
为什么会提示“unrecognized command”?
你大概率是直接在jdb里输入了Java代码(比如scanner.nextInt()),但jdb有自己专属的调试命令集合,它根本不认识原生的Java语句,只认print、eval、set这类调试指令。这是新手用jdb最容易踩的坑——别把jdb当成Java交互式控制台用,得用它提供的命令来执行Java表达式。
如何在jdb中用Scanner为变量赋值?
我拿一个示例代码来一步步演示,假设你的代码结构是这样的:
import java.util.Scanner; public class DebugTest { private int num; public static void main(String[] args) { DebugTest test = new DebugTest(); Scanner scanner = new Scanner(System.in); // 这行设为断点,方便调试时操作 test.num = scanner.nextInt(); System.out.println("Num is: " + test.num); scanner.close(); } }
步骤1:编译代码时保留调试信息
编译必须加-g参数,不然jdb没法识别变量和行号:
javac -g DebugTest.java
步骤2:启动jdb并设置断点
# 启动jdb调试目标类 jdb DebugTest # 在给num赋值的行设置断点(假设行号是9) stop at DebugTest:9 # 运行程序 run
程序会停在断点处,此时Scanner对象已经被实例化完成,可以操作了。
步骤3:用eval命令执行Scanner赋值
jdb的eval命令是用来执行Java表达式的,这才是正确的操作方式:
- 直接通过Scanner读取输入赋值给实例变量:
输入这条命令后,jdb会等待你在控制台输入一个整数,输完回车,变量就赋值成功了。eval test.num = scanner.nextInt() - 也可以先存到临时变量再赋值(适合复杂场景):
eval int temp = scanner.nextInt() eval test.num = temp
步骤4:验证赋值结果
用print命令查看变量值,确认赋值成功:
print test.num
额外注意事项
- 必须等Scanner对象被实例化后再执行
eval命令,不然jdb会报“找不到变量scanner”的错误。 - 你的环境里jdb是1.8,但Java运行时是9,可能存在小版本兼容性问题,如果遇到奇怪的报错,建议换成和Java运行时同版本的jdb(也就是9版本的jdb)来调试,避免版本不匹配导致的问题。
内容的提问来源于stack exchange,提问作者Victor
相关产品推荐
相关产品推荐

