如何对String类型数值做大小比较?输入非数字触发NumberFormatException
String类型存储数字输入的校验问题
需求与现有代码
我需要实现一个功能:要求用户输入0到180之间的数字,但存储输入值的变量必须为String类型。编写的代码如下:
// Saisie du nombre de jours de location System.out.println("Entrez le nombre de jours de location (supérieur à 0 et inférieur ou égal à 180) : "); nbJoursLouer = Clavier.lireString(); while ( nbJoursLouer < "0" || nbJoursLouer > "180") { System.out.println("Entrée invalide !"); System.out.println("Entrez le nombre de jours de location (supérieur à 0 et inférieur ou égal à 180) : "); nbJoursLouer = Clavier.lireString(); }
遇到的异常
运行程序时,若输入字母而非数字,会抛出如下异常:
Entrez le nombre de jours de location (supérieur à 0 et inférieur ou égal à 180) : d Exception in thread "main" java.lang.NumberFormatException: For input string: "d" at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67) at java.base/java.lang.Integer.parseInt(Integer.java:668) at java.base/java.lang.Integer.parseInt(Integer.java:786) at Tp1.main(Tp1.java:100)
疑问
能否对String类型使用>和<运算符进行大小比较?
解答
1. String类型不能直接用>、<做数值大小比较
Java中,>和<运算符仅支持基本数据类型(如int、double)的数值比较,或是引用类型的内存地址比较(这对业务逻辑毫无意义)。直接对String使用这些运算符,编译器会直接报错,你现有代码的写法本身无法通过编译。
你遇到的NumberFormatException,是因为后续代码中调用了Integer.parseInt(nbJoursLouer)将字符串转为整数,当输入非数字内容时,这个转换就会抛出异常。
2. 修正后的输入校验方案
要满足「用String存储输入+校验0-180的数字」的需求,需要分两步校验:先确认输入是合法整数,再判断数值范围。以下是两种可行的实现方式:
方式一:用try-catch捕获转换异常
// 租赁天数输入 System.out.println("Entrez le nombre de jours de location (supérieur à 0 et inférieur ou égal à 180) : "); String nbJoursLouer = Clavier.lireString(); boolean isValid = false; while (!isValid) { try { // 尝试将字符串转为整数,校验是否为合法数字 int days = Integer.parseInt(nbJoursLouer); // 校验数值范围 if (days > 0 && days <= 180) { isValid = true; } else { System.out.println("Entrée invalide ! La valeur doit être entre 1 et 180."); System.out.println("Entrez le nombre de jours de location : "); nbJoursLouer = Clavier.lireString(); } } catch (NumberFormatException e) { // 输入非数字时触发 System.out.println("Entrée invalide ! Veuillez saisir un nombre entier."); System.out.println("Entrez le nombre de jours de location : "); nbJoursLouer = Clavier.lireString(); } } // 此时nbJoursLouer为符合要求的String类型数字
方式二:用正则表达式先校验格式
System.out.println("Entrez le nombre de jours de location (supérieur à 0 et inférieur ou égal à 180) : "); String nbJoursLouer = Clavier.lireString(); while (!nbJoursLouer.matches("^[0-9]+$") || Integer.parseInt(nbJoursLouer) <= 0 || Integer.parseInt(nbJoursLouer) > 180) { if (!nbJoursLouer.matches("^[0-9]+$")) { System.out.println("Entrée invalide ! Veuillez saisir un nombre entier."); } else { System.out.println("Entrée invalide ! La valeur doit être entre 1 et 180."); } System.out.println("Entrez le nombre de jours de location : "); nbJoursLouer = Clavier.lireString(); }
这两种方式都能确保输入合法,同时保留变量的String类型,避免异常抛出。
内容的提问来源于stack exchange,提问作者Alain Karam
相关产品推荐
相关产品推荐

