- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我收到不需要的输入时,我再次调用该方法,但在第二次迭代时,字符串上仍然留有一个字符。为什么它不创建一个全新的字符串并替换旧的值?
首先我在扫描仪中输入“mmmm”,这会触发 if 语句中的条件并调用 createSocial()
,然后重新运行循环,然后我输入一个新输入5555。现在这是我没有得到的:当我打印出新的字符串时,它们显示为 5555,但是然后在循环中打印它们时留下了“m”,为什么?
public class test {
public static String createSocial() {
Scanner sc = new Scanner(System.in);
String social = sc.nextLine();
String digit = social;
System.out.println(social + " SOCIAL");
System.out.println(digit + " DIGIT");
if (social.length() != 4) {
System.out.println("You did not type 4 digits, try again");
createSocial();
}
//check non-integers
while(digit.length() > 0) {
System.out.println( digit.charAt(0) + "<---");
if(Character.isDigit( digit.charAt(0) ) == false) {
System.out.println("You did not type your last 4 digits correctly, try again");
createSocial();
}
digit = digit.substring(1);
}
return social;
}
}
这是我的输出:
enter the last 4 digits of your Social Security number
mmmm //(This is my first input for the scanner)
mmmm SOCIAL
mmmm DIGIT
m<---
You did not type your last 4 digits correctly, try again
5555 //(this is my input for the scanner the second time around)
5555 SOCIAL
5555 DIGIT
5<---
5<---
5<---
5<---
m<---
You did not type your last 4 digits correctly, try again
最佳答案
您看到 m 的原因如下:
5<---
5<---
5<---
5<---
m<---
只是因为您在开始递归调用之前没有清除 social 字符串变量。实际上,当进行此递归调用时,您应该这样做:
social = createSocial();
这样可以保证 social 始终保留该递归调用的真实值,而不是之前递归调用的值。如果您不从 createSocial() 方法获取返回值,您将永远不会获得新结果,因为 social 变量的范围对于方法本身而言是本地的。您需要接受返回值,就像第一次初始调用 createSocial() 方法时一样。
但这还不是全部,您还需要在每次递归调用( digit = social;
)后更新 digit 变量内容。在我看来,这比必要的更复杂。我理解为什么您添加了 digit 变量,但是如果您仔细查看代码,您可以通过继续利用 social 变量来完成同样的事情进行数值分解。您只需将原始值保存在 social 中,然后在方法返回的变量中进行数值分割,例如:
private static int methodCalls = 0; // Class Global Member Variable
public static String createSocial() {
methodCalls++;
Scanner sc = new Scanner(System.in);
String social = sc.nextLine();
System.out.println(social + " SOCIAL");
if (social.length() != 4) {
System.out.println("You did not type 4 digits, try again");
social = createSocial();
}
// returnResult will eventually will hold the
// valid result to return.
String returnResult = social;
//check non-integers
while (social.length() > 0) {
System.out.println(social.charAt(0) + " <--- Method call: " + methodCalls);
if (Character.isDigit(social.charAt(0)) == false) {
System.out.println("You did not type your last 4 digits correctly, try again");
social = createSocial();
}
social = social.substring(1);
}
methodCalls--;
return returnResult;
}
使用您发布的示例参数(mmmmm 和 5555),您可以使用上面的代码,如下所示:
System.out.println(createSocial());
输入mmmmm和5555后,控制台的输出结果将如下所示:
mmmmm
mmmmm SOCIAL
You did not type 4 digits, try again
5555
5555 SOCIAL
5 <--- Method call: 2
5 <--- Method call: 2
5 <--- Method call: 2
5 <--- Method call: 2
5 <--- Method call: 1
5 <--- Method call: 1
5 <--- Method call: 1
5 <--- Method call: 1
5555
为什么都是5 <---
?因为单次递归调用。标记为 Method call: 1 的 5 是对 createSocial() 方法的初始调用。任何超过 1 的方法调用都是递归调用。每次调用四个5 <---
已列出。
这一切都可以以更简单的方式完成,并且不需要递归来执行此任务,可以使用循环来代替,例如:
public static String createSocial() {
String ls = System.lineSeparator();
Scanner sc = new Scanner(System.in);
String social = "";
while (social.equals("")) {
System.out.print("Please enter the last four digits of " + ls
+ "your Social Security Number: --> ");
social = sc.nextLine();
if (!social.matches("\\d{4}")) {
System.err.println("Invalid Entry! Please Try Again..." + ls);
social = "";
}
}
return social;
}
但是如果需要递归,那么你可以这样做:
public static String createSocial() {
String ls = System.lineSeparator();
Scanner sc = new Scanner(System.in);
String social = "";
System.out.print("Please enter the last four digits of " + ls
+ "your Social Security Number: --> ");
social = sc.nextLine();
if (!social.matches("\\d{4}")) {
System.err.println("Invalid Entry! Please Try Again..." + ls);
social = createSocial();
}
return social;
}
使用 Java 的 String#matches()方法连同一个小Regular Expression检查数据输入有效性消除了对大量代码的需要,并使内容更容易阅读。上述两个代码示例中 IF 语句条件的 matches() 方法中使用的正则表达式 (RegEx)
if (!social.matches("\\d{4}")) {
基本上意味着:如果用户输入字符串不是四位整数值,则显示“无效输入!”消息。
关于java - 调用自己的方法时,旧字符串值会留下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58090491/
尝试使用集成到 QTCreator 的表单编辑器,但即使我将插件放入 QtCreator.app/Contents/MacOS/designer 也不会显示。不过,相同的 dylib 文件确实适用于独
在此代码示例中。 “this.method2();”之后会读到什么?在返回returnedValue之前会跳转到method2()吗? public int method1(int returnedV
我的项目有通过gradle配置的依赖项。我想添加以下依赖项: compile group: 'org.restlet.jse', name: 'org.restlet.ext.apispark', v
我将把我们基于 Windows 的客户管理软件移植到基于 Web 的软件。我发现 polymer 可能是一种选择。 但是,对于我们的使用,我们找不到 polymer 组件具有表格 View 、下拉菜单
我的项目文件夹 Project 中有一个文件夹,比如 ED 文件夹,当我在 Eclipse 中指定在哪里查找我写入的文件时 File file = new File("ED/text.txt"); e
这是奇怪的事情,这个有效: $('#box').css({"backgroundPosition": "0px 250px"}); 但这不起作用,它只是不改变位置: $('#box').animate
这个问题在这里已经有了答案: Why does OR 0 round numbers in Javascript? (3 个答案) 关闭 5 年前。 Mozilla JavaScript Guide
这个问题在这里已经有了答案: Is the function strcmpi in the C standard libary of ISO? (3 个答案) 关闭 8 年前。 我有一个问题,为什么
我目前使用的是共享主机方案,我不确定它使用的是哪个版本的 MySQL,但它似乎不支持 DATETIMEOFFSET 类型。 是否存在支持 DATETIMEOFFSET 的 MySQL 版本?或者有计划
研究 Seam 3,我发现 Seam Solder 允许将 @Named 注释应用于包 - 在这种情况下,该包中的所有 bean 都将自动命名,就好像它们符合条件一样@Named 他们自己。我没有看到
我知道 .append 偶尔会增加数组的容量并形成数组的新副本,但 .removeLast 会逆转这种情况并减少容量通过复制到一个新的更小的数组来改变数组? 最佳答案 否(或者至少如果是,则它是一个错
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
noexcept 函数说明符是否旨在 boost 性能,因为生成的对象中可能没有记录异常的代码,因此应尽可能将其添加到函数声明和定义中?我首先想到了可调用对象的包装器,其中 noexcept 可能会产
我正在使用 Angularjs 1.3.7,刚刚发现 Promise.all 在成功响应后不会更新 angularjs View ,而 $q.all 会。由于 Promises 包含在 native
我最近发现了这段JavaScript代码: Math.random() * 0x1000000 10.12345 10.12345 >> 0 10 > 10.12345 >>> 0 10 我使用
我正在编写一个玩具(物理)矢量库,并且遇到了 GHC 坚持认为函数应该具有 Integer 的问题。是他们的类型。我希望向量乘以向量以及标量(仅使用 * ),虽然这可以通过仅使用 Vector 来实现
PHP 的 mail() 函数发送邮件正常,但 Swiftmailer 的 Swift_MailTransport 不起作用! 这有效: mail('user@example.com', 'test
我尝试通过 php 脚本转储我的数据,但没有命令行。所以我用 this script 创建了我的 .sql 文件然后我尝试使用我的脚本: $link = mysql_connect($host, $u
使用 python 2.6.4 中的 sqlite3 标准库,以下查询在 sqlite3 命令行上运行良好: select segmentid, node_t, start, number,title
我最近发现了这段JavaScript代码: Math.random() * 0x1000000 10.12345 10.12345 >> 0 10 > 10.12345 >>> 0 10 我使用
我是一名优秀的程序员,十分优秀!