Java中setup1与checkInput方法未终止、重复输出问题修复求助
问题分析与修复方案
问题现象
- 调用
checkInput()后执行setup1(),checkInput()无法正常完成执行,进入等待状态 - 多次触发错误输入后,最终正确输入的内容会重复输出,重复次数等于之前错误输入导致的方法调用次数
问题根源
原代码采用递归调用处理错误输入:当checkInput()检测到输入不合法时,直接调用setup1()重新获取输入,但之前的checkInput()调用并未终止,而是留在调用栈中挂起。当最终输入正确时,所有挂起的checkInput()会依次执行,导致重复输出。
修复方案
将递归逻辑改为循环控制,让checkInput()仅负责验证输入合法性,setup1()通过循环重复获取输入直到验证通过,彻底避免调用栈堆积问题。
修复后的完整代码
import java.io.IOException; public class BaseConverter { private static final char[] Symbols = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'}; private static String R; private static int p; static int numlimit; static char letterLimit; private int q; public static void main(String[] args) throws IOException { // 启动输入流程 setup1(); } private static void setup1() throws IOException { while (true) { // 输入目标进制p System.out.print("p="); p = DataInput.getInt(); // 设置输入内容的合法范围 if(p <= 10) { numlimit = p - 1; } else { // 限制进制最大为36(0-9+26个字母),避免数组越界 if (p > 36) { System.out.println("进制p不能超过36!请重新输入"); continue; } letterLimit = Symbols[p - 11]; } // 输入待转换的数值R System.out.print("R="); String a = DataInput.getString(); R = a.toUpperCase(); // 验证输入合法性,合法则退出循环 if (checkInput(R)) { // 这里可以统一处理点转逗号的需求 R = R.replace('.', ','); System.out.println(R); break; } else { System.out.println("输入错误!请重新输入"); } } } // 仅负责验证输入合法性,返回布尔结果 private static boolean checkInput(String val) { for(int i = 0; i < val.length(); i++){ char x = val.charAt(i); int n = x - 48; // 处理p<=10的情况:仅允许数字,且不超过进制范围 if(p < 11){ if(Character.isLetter(x) || n > numlimit){ return false; } } // 处理p>10的情况:允许数字和对应范围内的字母 else { if(!Character.isLetter(x) && !Character.isDigit(x)){ return false; } if(Character.isLetter(x) && x > letterLimit){ return false; } } } return true; } private static void convertTo10() { // 后续进制转换逻辑实现 } }
关键修改点
- 将
setup1()改为循环结构,通过while(true)持续获取输入,直到验证通过后break退出循环,彻底避免递归调用栈堆积 - 重构
checkInput():仅返回boolean类型的验证结果,不再调用其他方法,职责单一 - 增加进制
p的范围校验(最大36),防止数组越界异常 - 移除原代码中无效的
readyNum赋值逻辑(原代码中readyNum=R完全覆盖拼接结果,无实际作用) - 将点转逗号的逻辑统一放在验证通过后处理,避免重复操作
内容的提问来源于stack exchange,提问作者Tim Matthew
相关产品推荐
相关产品推荐

