Java编程谜题:挑战你的编程功底

5星 · 超过95%的资源 需积分: 10 11 下载量 106 浏览量 更新于2024-08-02 收藏 444KB PDF 举报
"这篇资源包含了几个有趣的Java编程谜题,旨在测试和提升你的Java技能。由Joshua Bloch和Neal Gafter等知名专家编写,来自Google Inc.和Microsoft Corporation。这些谜题涵盖Java语言和核心库,但不涉及图形用户界面(GUI)或企业级应用。其中展示了如何通过分析短小的程序来识别奇怪的行为,并解决问题,从而学习到如何避免常见的编程陷阱和理解Java的内在机制。" 谜题解析: 题目中提供的代码是"SimpleQuestion"类,包含一个静态方法"yesOrNo"和主方法"main"。这个程序的目的是根据输入的字符串判断是否为肯定回答,并返回对应的布尔值。"yesOrNo"方法首先将输入字符串转换为小写,然后检查是否等于"yes"、"y"或"t",如果满足条件则将字符串设置为"true"。最后,使用"Boolean.getBoolean"方法将字符串转换为布尔值。 代码中的问题在于,当输入字符串为"true"时,方法会将其改为"true",然后尝试将这个字符串转换为布尔值。然而,"Boolean.getBoolean"方法并不像预期那样处理这种情况。它只接受"true"或"false"这两个字符串作为有效输入,并返回相应的布尔值。其他任何非空字符串都将导致抛出"NullPointerException"。 主方法"main"调用"yesOrNo"两次,分别传入"true"和"YeS"。由于"true"已经满足了转换条件,所以第一次调用将不会出现异常。然而,第二次调用传入的"YeS"在经过转换后为"true",这会导致"Boolean.getBoolean"抛出异常,因为"true"不是一个有效的布尔字符串。 实际运行时,程序会抛出异常,因此正确答案是(a) falsefalse(在实践中)。这是因为第二个"yesOrNo"调用会在尝试转换"true"时失败,导致程序中断,而第一个调用会返回"true",所以主方法的输出在异常发生前会被打印出来。 谜题的解决方法是修改"yesOrNo"方法,避免将字符串替换为"true"。可以直接在if语句中返回true,如下所示: ```java public static boolean yesOrNo(String s) { s = s.toLowerCase(); if (s.equals("yes") || s.equals("y") || s.equals("t")) { return true; } return Boolean.getBoolean(s); } ``` 这样,即使输入的字符串不是"yes"、"y"或"t",也不会尝试将非标准的字符串转换为布尔值,而是直接使用"Boolean.getBoolean"处理原始输入。