分配:获取两个字符串,以逗号分隔。保存到哈希图中。
目标:使用单个try-catch块来防止用户输入错误数量的字符串。
问题:如果仅提供一个字符串, register.put 行将抛出“ IndexOutOfBounds”,但是如果我提供3个以上的字符串,则好像数组的大小在增加以处理其他订单项(根据IntelliJ IDEA中的调试器)。这是 nextLine()。split 函数的预期功能,还是我遗漏了一些明显的东西?我知道我可以使用另一个循环来更正此问题,但是我很困惑“收集器”如何处理以下输入:
你好,世界,不是,它,A,伟大,白天?
HashMap <String, String> register = new HashMap();
Scanner in = new Scanner(System.in);
String[] collector = new String[2];
try {
collector = in.nextLine().split(",");
register.put(collector[0], collector[1]);
}catch (IndexOutOfBoundsException e){
System.out.println("\nYou didn't use the correct format!");
System.out.println("Please use the format provided!");
}
答案 0 :(得分:1)
尝试处理错误的输入,而不是捕获异常。
HashMap <String, String> register = new HashMap();
Scanner in = new Scanner(System.in);
String[] collector = in.nextLine().split(",");
// validate inputs here
if (collector.length == 2 ) {
register.put(collector[0], collector[1]);
} else {
System.out.println("\nYou didn't use the correct format!");
System.out.println("Please use the format provided!");
}
答案 1 :(得分:0)
如果只愿意使用try-catch,则可以使用自定义异常来处理输入。
如果是这样,您可以尝试
public class Test1 {
public static void main(String[] args) {
HashMap<String, String> register = new HashMap();
Scanner in = new Scanner(System.in);
String[] collector;
try {
collector = in.nextLine().split(",");
if (collector.length > 2) {
throw new Test1().new MaxLimitCrossed();
} else if (collector.length < 2) {
throw new Test1().new MinLimitCrossed();
}
register.put(collector[0], collector[1]);
System.out.println(register.toString());
} catch (MinLimitCrossed e) {
System.out.println(e.getMessage());
} catch (MaxLimitCrossed e) {
System.out.println(e.getMessage());
}
}
class MaxLimitCrossed extends Exception {
public MaxLimitCrossed() {
super("Max Limit Crossed.");
}
}
class MinLimitCrossed extends Exception {
public MinLimitCrossed() {
super("Min Limit Crossed.");
}
}
}
将此作为参考,您可以根据需要更改自定义例外。只是试图展示如何做到这一点。