校验的强度 = 数据被破坏后的损失

/**
复制代码
* 解析一行输入"张三,水电工,8":split拆成3部分,分别打印姓名、工种、工龄;判断输入是否包含"工"字 * <p> * 注意: * 1、String.strip()和 String.trim() * 2、String.split() * 3、String.replace() * 4、String.isEmpty() * 5、String.matches() * 6、Integer.parseInt()遇到非数字字符串**一定会抛出运行时异常**,异常一旦抛出,代码直接中断 * 7、正则表达式 "[,,]+" * 8、String.contains() * */ import java.util.Scanner; public class Day18TradesManInfoParser { private static final int MAX_WORK_YEAR = 80; // 工龄上限:大于80就拦截 private static final int MIN_WORK_YEAR = 0; // 工龄下限:0 = 刚入行合法,负数拦截 private static final int PART_COUNT = 3; // 只能拆解成三部分 private static final int INDEX_WORK_YEAR = 2; // 指定工龄字段的索引值 public static void main(String[] args) { Scanner in = new Scanner(System.in); while (true) { System.out.printf("%n%n---------------------把用户输入的信息拆解成三部分--------------------"); System.out.printf("%n请输入师傅的信息(姓名,工种,工龄)【0 - 退出】:"); String tradesMan = in.nextLine(); // 判断是否输入 0-退出,不是就继续执行 if ("0".equals(tradesMan)) { break; } else { // 判断是否空白输入 if (tradesMan.isEmpty()) { System.out.printf("%n无效的输入!"); } else { /* 有输入的话,先分段拆解: 1、输入只认逗号,逗号有全角或半角,统一换成半角逗号后拆解 2、或者使用正则表达式,直接拆解 3、姓名、工种的输入允许有空格,显示时需要去除空格 4、用String[]接收拆解后的数据,这时工龄也是String类型,需要转换为int 然后判断: 1、是否刚好是三段?多了或少了都拦截 2、每一段是否空白,空白的要拦截 3、工龄是int类型,不是int类型要拦截,负数要拦截,超过80的要拦截 */ // 拆解 String[] parts = tradesMan.split("[,,]+"); // 判断输入的是否是三部分,多了或少了都拦截 int partCount = parts.length; if (partCount < PART_COUNT) { System.out.printf("%n亲,输入的数据少了,请重新输入!"); continue; } if (partCount > PART_COUNT) { System.out.printf("%n亲,输入的数据多了,请重新输入!"); continue; } // 判断输入是否为空,空的都拦截 boolean hasEmpty = false; for (int i = 0; i < parts.length; i++) { parts[i] = parts[i].strip(); if (parts[i].isEmpty()) { hasEmpty = true; break; } } if (hasEmpty) { System.out.printf("%n亲,每一项都不能为空,请重新输入!"); continue; } // 判断工龄字段是否是数字,是就转换成整形,不是就拦截 String workYearStr = parts[INDEX_WORK_YEAR]; if (workYearStr.matches("\\d+")) { int workYears = Integer.parseInt(workYearStr); // 判断工龄是否是int类型,是否是负数,是否大于80 if (workYears < MIN_WORK_YEAR) { System.out.printf("%n工龄不能小于%2d年,请重新输入!", MIN_WORK_YEAR); continue; } if (workYears > MAX_WORK_YEAR) { System.out.printf("%n工龄不能大于%2d年,请重新输入!", MAX_WORK_YEAR); continue; } // 去除前后空格,名字允许有空格;工种不允许有空格。数据清洗后赋值给变量 String name = parts[0].strip(); String jobType = parts[1].strip().replace(" ", ""); // TODO:拆解后校验过且合法的数据打包成对象,保存合法数据 // TradesMan man = new TradesMan(name, jobType, workYears); // 格式化展示对象 boolean hasContain = tradesMan.contains("工"); String containStr = (hasContain ? "包含" : "不包含"); System.out.printf("%n您输入的工种【 %s 】工字!",containStr); System.out.printf("%n【您输入的信息】姓名:%s ,工种:%s ,工龄:%2d 年", name, jobType, workYears); } else { System.out.printf("%n输入无效的工龄,请重新输入!"); } } } } } }
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP