2

如何编写一段 Java 代码来检查字符串是否可转换为整数,即它的任何字符是否可转换为 0 到 9 之间的整数?我想到了这样的事情:

String s = "...";

for (int i = 0; i < s.length(); i++)

{

    int h = Integer.parseInt(s.substring(i, i + 1));
    if (h < 0 || h > 9)
        throw new IntegerFormatException();   
}

catch (IntegerFormatException e)

{

    System.out.println("This is not an integer");

}

其中 IntegerFormat Exception 类似于

public class IntegerFormatException extends Exception

{

    public IntegerFormatException()
    {
        super ("This string isn't convertible to  an integer");
    }
    public IntegerFormatException(String message)
    {
        super (message);
    }

}

但是,如果我然后尝试使用“8&35”作为字符串的代码,我不会收到消息“这不是整数”,但会收到 IDE 自动红色墨水消息说明

线程“main”中的异常 java.lang.NumberFormatException:对于输入字符串:“&”

at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:569)
at java.lang.Integer.parseInt(Integer.java:615)
at project.pkg9.pkg2.Project92.main(Project92.java:60)

Java 结果:1

我的代码错了吗?如果是,我该如何解决?非常感谢您的所有回答。

4

9 回答 9

4

已经有一个运行时异常,使用它!

String s = "8&35";
try {
    int result = Integer.parseInt(s);
    System.out.println("This is parsable: " + result);
} catch (NumberFormatException e) {
    System.err.println("s is  NOT parsable....");
}
于 2017-06-06T13:34:00.330 回答
3

那是因为如果您尝试解析不是 int 的内容,并且您没有在 try/catch 块中捕获它,Integer.parseInt则会引发异常。NumberFormatException您可以在您的 catch 块中捕获它,或者在尝试解析之前使用正则表达式来检查该位置的字符(或者,如评论中所指出的那样Character.isDigit())。

此外,没有必要查看单个数字是小于 0 还是大于 9 - 单个数字怎么可能不是0 - 9 范围内的整数?这不会真正告诉您该字符是否有效int,因为除非您比较 ASCII 值,否则谈论 & 是否大于 9 是没有意义的。

于 2017-06-06T13:31:38.010 回答
2

您可以使用正则表达式代替循环。这将起作用并且也会抛出IntegerFormatException空字符串。

String s = "...";

if (!s.matches("[0-9]+")) {
    throw new IntegerFormatException();
}

它不会涵盖Integer类型容量溢出 - 我的意思是上面的大量数字Integer.MAX_VALUE。不确定你是否需要那个。

于 2017-06-06T13:44:39.917 回答
2

我会用 Regex 来做:

if(s.matches("[0-9]"))
{
    //it's an Integer, 
    //execute logic
}
于 2017-06-06T13:37:20.547 回答
1

尝试这个

String regex = "^-?[0-9]+$";
if (s.matches(regex) {
    // it's a number  
} else {
   // not a number
}
于 2017-06-06T13:42:58.327 回答
1

您应该参考该Integer.parseInt(String s)方法的文档。此方法的完整标头是public static int valueOf(String s) throws NumberFormatException并且文档指出NumberFormatException当字符串不包含可解析整数时抛出 。

要获得您描述的功能,您应该考虑如果 char 可解析为 int,则将单个 char 传递给函数将始终产生从 0 到 9(包括)的整数,因此,您的 if 语句可能是不必要的。为了使您的实现工作,您应该捕获NumberFormatException并使用它来确定 char 是否正确解析。

此外,为了简化代码,您还可以使用s.charAt(i)方法而不是s.substring(i, i + 1). 您可能还想查看正则表达式以获得您解释的行为。

于 2017-06-06T13:39:16.217 回答
1

Integer.parseInt(s.substring(i, i + 1));自己抛出异常。

特别是,它会抛出java.lang.NumberFormatException:未被您捕获的东西。

如果您确实需要使用您的异常(已经有一个,为什么不使用那个?)请改用以下内容:

public static void main(String[] args) {
    String s = "1234/&&56";

    try{
        for (int i = 0; i < s.length(); i++)

        {

            char c = s.charAt(i);
            int h = c-'0';
            
            if (h < 0 || h > 9)
                throw new IntegerFormatException();   
        }



    }catch(IntegerFormatException e)
    {

        System.out.println("This is not an integer");

    }
}

-请注意,在您尝试解析signed数字的情况下,您还应该检查第一个字符(可能是符号)。

于 2017-06-06T13:34:39.240 回答
1

您可以使用 Character 类 isdigit api 或其他 api 来测试它是否是数字

String s = "1234/&&56";
         for(int i=0;i<s.length();i++){
             char ch=s.charAt(i);
             if((Character.isDigit(ch))){
                 System.out.println(ch);
             }
         }
于 2017-06-06T13:45:43.540 回答
-2

函数 chr($i) 返回一个包含与 $i 等效的字符的单字符字符串,其中 $i 是 0 到 255 之间的整数。

于 2021-04-02T13:51:33.333 回答