如何在 Java 中检查字符串是否可以转换为整数

JavaBeginner
立即练习

介绍

在这个实验中,你将学习如何在 Java 中检查一个字符串是否可以转换为整数。这是处理用户输入或外部数据源数据的一项基本技能。

你将探索使用 Integer.parseInt() 方法尝试进行转换,学习如何使用 NumberFormatException 处理潜在的错误,并掌握在尝试解析字符串之前对其进行验证的技巧,以确保代码的健壮性和无错性。

尝试使用 Integer.parseInt() 进行解析

在这一步中,我们将探索如何在 Java 中将 String(文本)转换为 int(整数)。这是编程中的常见任务,特别是当你需要从用户那里获取数字输入或从文件中读取数字时。

Java 为此提供了一个内置方法 Integer.parseInt()。让我们看看它是如何工作的。

  1. 首先,确保你位于 ~/project 目录中。如果需要,你可以在终端中使用命令 cd ~/project

  2. 现在,让我们在 ~/project 目录中创建一个名为 StringToInt.java 的新 Java 文件。你可以通过在左侧的文件资源管理器中右键单击,选择“新建文件”,然后输入 StringToInt.java 来完成此操作。

  3. 在代码编辑器中打开 StringToInt.java 文件,并粘贴以下代码:

    public class StringToInt {
        public static void main(String[] args) {
            String numberString = "123";
            int numberInt = Integer.parseInt(numberString);
    
            System.out.println("The string is: " + numberString);
            System.out.println("The integer is: " + numberInt);
        }
    }

    让我们来看看新的部分:

    • String numberString = "123";:我们声明了一个名为 numberStringString 变量,并将其赋值为 "123"。注意,"123" 用双引号括起来,表示它是一个字符串。
    • int numberInt = Integer.parseInt(numberString);:这是这一步的核心。我们调用 Integer.parseInt() 方法,并将 numberString 作为参数传递。此方法尝试将字符串 "123" 转换为整数。结果存储在一个名为 numberIntint 变量中。
    • System.out.println("The string is: " + numberString);:这一行打印原始字符串。
    • System.out.println("The integer is: " + numberInt);:这一行打印转换后的整数。
  4. 保存文件(Ctrl+S 或 Cmd+S)。

  5. 现在,让我们编译程序。打开终端并运行以下命令:

    javac StringToInt.java

    如果编译成功,你应该看不到任何输出,并且 ~/project 目录中会创建一个 StringToInt.class 文件。

  6. 最后,运行编译后的程序:

    java StringToInt

    你应该会看到以下输出:

    The string is: 123
    The integer is: 123

    如你所见,Integer.parseInt() 方法成功地将字符串 "123" 转换为整数 123

在下一步中,我们将探讨当字符串无法转换为整数时会发生什么。

捕获 NumberFormatException 异常

在上一步中,我们使用 Integer.parseInt() 成功地将一个仅包含数字的字符串转换为了整数。但如果字符串包含非数字字符,会发生什么呢?让我们一探究竟。

Integer.parseInt() 尝试转换一个并非有效数字表示的字符串时,它会抛出一个 NumberFormatException。这是一种表明数字字符串格式存在问题的错误类型。

为了优雅地处理这类错误,我们可以使用 try-catch 块。try-catch 块允许我们“尝试”执行一段可能引发错误的代码,如果错误发生,我们可以“捕获”它并以特定方式进行处理,从而避免程序崩溃。

让我们修改 StringToInt.java 程序来演示这一点。

  1. 在 WebIDE 编辑器中打开 StringToInt.java 文件。

  2. 修改代码,加入 try-catch 块并更改输入字符串:

    public class StringToInt {
        public static void main(String[] args) {
            String numberString = "abc"; // This string cannot be parsed as an integer
    
            try {
                int numberInt = Integer.parseInt(numberString);
                System.out.println("The string is: " + numberString);
                System.out.println("The integer is: " + numberInt);
            } catch (NumberFormatException e) {
                System.out.println("Error: Could not convert the string to an integer.");
                System.out.println("Details: " + e.getMessage());
            }
        }
    }

    以下是我们添加的内容:

    • String numberString = "abc";:我们将字符串改为 "abc",显然它不是一个有效的整数。
    • try { ... }try 块内的代码是我们要尝试执行的内容。在这种情况下,是 Integer.parseInt() 调用。
    • catch (NumberFormatException e) { ... }:如果 try 块内发生 NumberFormatExceptioncatch 块内的代码将被执行。
    • System.out.println("Error: Could not convert the string to an integer.");:这一行打印一条用户友好的错误消息。
    • System.out.println("Details: " + e.getMessage());:这一行打印有关异常的更多详细信息,这对调试很有帮助。
  3. 保存文件(Ctrl+S 或 Cmd+S)。

  4. 在终端中编译修改后的程序:

    javac StringToInt.java
  5. 运行编译后的程序:

    java StringToInt

    这次,由于 "abc" 无法被解析为整数,NumberFormatException 将被捕获,你应该会看到类似如下的输出:

    Error: Could not convert the string to an integer.
    Details: For input string: "abc"

    程序没有崩溃,而是由 catch 块处理了错误并打印了有用的消息。这带来了更好的用户体验!

使用 try-catch 块对于编写能够处理意外输入或情况的健壮程序至关重要。

解析前验证字符串

在上一步中,我们学习了在 Integer.parseInt() 失败时如何捕获 NumberFormatException。虽然捕获异常对于处理错误很重要,但通常最好从一开始就防止错误发生。

在这一步中,我们将学习如何在尝试将字符串解析为整数 之前 对其进行验证。这包括检查字符串是否仅包含数字。

一种方法是遍历字符串的每个字符并检查它是否为数字。另一种常见的方法是使用正则表达式,但对于初学者来说,简单的循环更容易理解。

让我们再次修改 StringToInt.java 程序,加入验证检查。

  1. 在 WebIDE 编辑器中打开 StringToInt.java 文件。

  2. 将现有代码替换为以下内容:

    public class StringToInt {
    
        public static void main(String[] args) {
            String numberString = "123a"; // This string contains a non-digit character
    
            if (isValidInteger(numberString)) {
                int numberInt = Integer.parseInt(numberString);
                System.out.println("The string is: " + numberString);
                System.out.println("The integer is: " + numberInt);
            } else {
                System.out.println("Error: The string '" + numberString + "' is not a valid integer.");
            }
        }
    
        // Method to check if a string is a valid integer
        public static boolean isValidInteger(String str) {
            if (str == null || str.isEmpty()) {
                return false; // An empty or null string is not a valid integer
            }
            for (int i = 0; i < str.length(); i++) {
                char c = str.charAt(i);
                if (i == 0 && (c == '-' || c == '+')) {
                    // Allow a leading sign (+ or -)
                    continue;
                }
                if (!Character.isDigit(c)) {
                    return false; // Found a non-digit character
                }
            }
            return true; // All characters are digits (or a leading sign)
        }
    }

    让我们看看这些更改:

    • 我们添加了一个名为 isValidInteger(String str) 的新方法。此方法接受一个字符串作为输入,如果该字符串表示一个有效的整数,则返回 true,否则返回 false
    • isValidInteger 内部,我们首先检查字符串是否为 null 或为空。
    • 然后我们遍历字符串的每个字符。
    • Character.isDigit(c) 是 Java 的一个内置方法,用于检查一个字符是否为数字。
    • 我们添加了一个检查,允许字符串开头有正负号。
    • main 方法中,我们现在使用 if-else 语句。在尝试解析字符串之前,我们调用 isValidInteger() 来检查该字符串。
    • 如果 isValidInteger() 返回 true,我们继续执行 Integer.parseInt()
    • 如果返回 false,我们打印一条错误消息,而不尝试解析,从而避免 NumberFormatException
  3. 保存文件(Ctrl+S 或 Cmd+S)。

  4. 在终端中编译修改后的程序:

    javac StringToInt.java
  5. 运行编译后的程序:

    java StringToInt

    由于字符串 "123a" 包含非数字字符,isValidInteger 方法将返回 false,你应该会看到以下输出:

    Error: The string '123a' is not a valid integer.

    现在,让我们将字符串改回一个有效的整数,看看 if-else 语句的另一个分支。

  6. StringToInt.java 文件中,将 numberString 变量改回 "456"

    String numberString = "456";
  7. 保存文件。

  8. 再次编译并运行程序:

    javac StringToInt.java
    java StringToInt

    这次,isValidInteger 将返回 true,你应该会看到:

    The string is: 456
    The integer is: 456

通过在解析前验证字符串,我们可以更优雅地处理无效输入,并避免像 NumberFormatException 这样的运行时错误。这是编写更健壮、可靠代码的良好实践。

总结

在本次实验中,我们学习了如何在 Java 中使用 Integer.parseInt() 方法将 String 转换为 int。我们创建了一个 Java 文件,编写代码来演示这种转换,并编译了程序。该方法对于处理来自各种来源的数字输入至关重要。