Java 当用户输入字符串而不是整数输入时捕获错误

Java 当用户输入字符串而不是整数输入时捕获错误,java,Java,我希望代码在用户输入字符串而不是整数时捕获错误。你可以看到,我尝试了一个仍然不起作用的try-catch块。除此之外,其他一切都很完美。我怎样才能解决这个问题 以下是输出的方式: 欢迎来到方块和立方体表 输入一个整数:5 错误!无效的整数。再试一次。 输入一个整数:-5 错误!数字必须大于0 输入一个整数:101 错误!数字必须小于或等于100 输入一个整数:9 平方立方数 ====== ======= ===== 1 1 1 2 4 8 3

我希望代码在用户输入字符串而不是整数时捕获错误。你可以看到,我尝试了一个仍然不起作用的try-catch块。除此之外,其他一切都很完美。我怎样才能解决这个问题

以下是输出的方式:

欢迎来到方块和立方体表
输入一个整数:5
错误!无效的整数。再试一次。
输入一个整数:-5
错误!数字必须大于0
输入一个整数:101
错误!数字必须小于或等于100
输入一个整数:9
平方立方数
======  ======= =====
1       1       1
2       4       8
3       9       27
4       16      64
5       25      125
6       36      216
7       49      343
8       64      512
9       81      729
继续?(是/否):是
输入一个整数:3
平方立方数
======  ======= =====
1       1       1
2       4       8
3       9       27
代码如下:

import java.util.InputMismatchException;
import java.util.Scanner;

public class cube2 {

    public static void main(String[] args)
    {
        // Welcome the user
        System.out.println("Welcome to the Squares and Cubes table");
        System.out.println();

        Scanner sc = new Scanner(System.in);
        String choice = "y";

        do
        {
            // Get input from the user
            System.out.print("Enter an integer: ");
            int integer = sc.nextInt();


                 try {

                    break;
                }
                catch (NumberFormatException e) {
                    System.out.println("Error! Invalid integer. Try again.");
                }



            System.out.print("Enter an integer: ");
            integer = sc.nextInt();  





             if(integer<0){

                System.out.println("Error! Number must be greater than 0");
                System.out.print("Enter an integer: ");
                integer = sc.nextInt();

            }

             if(integer>100){

                System.out.println("Error! Number must be less than or equal to 100");

                System.out.print("Enter an integer: ");
                integer = sc.nextInt();
            }

            // Create a header
            String header = "Number  " + "Squared " + "Cubed   " + "\n"
                        +   "======  " + "======= " + "=====   ";
            System.out.println(header);

            int square = 0;
            int cube = 0;

            String row = "";
            for (int i = 1; i <= integer; i++)
            {

                square = i * i;
                cube = i * i * i;

                row = i + "       " + square + "       " + cube;
                System.out.println(row);
            }

            // See if the user wants to continue
            System.out.print("Continue? (y/n): ");
            choice = sc.next();
            System.out.println();

        }
        while (!choice.equalsIgnoreCase("n"));  
    }
}
import java.util.InputMismatchException;
导入java.util.Scanner;
公共类立方体2{
公共静态void main(字符串[]args)
{
//欢迎用户
System.out.println(“欢迎来到正方形和立方体表”);
System.out.println();
扫描仪sc=新的扫描仪(System.in);
字符串选择=“y”;
做
{
//从用户处获取输入
System.out.print(“输入整数:”);
int integer=sc.nextInt();
试一试{
打破
}
捕获(数字格式){
System.out.println(“错误!无效整数。请重试”);
}
System.out.print(“输入整数:”);
整数=sc.nextInt();
if(整数100){
System.out.println(“错误!数字必须小于或等于100”);
System.out.print(“输入整数:”);
整数=sc.nextInt();
}
//创建标题
字符串头=“数字”+“平方”+“立方”+“\n”
+   "======  " + "======= " + "=====   ";
系统输出打印项次(表头);
整数平方=0;
整数立方=0;
字符串行=”;

对于(int i=1;i
Integer.parseInt
方法是将
字符串
转换为int,如果字符串无法转换为
int
类型,则抛出
NumberFormatException

应该是这样的:

    System.out.print("Enter an integer: ");
    Scanner sc =new Scanner(System.in);

    try {
        int integer = Integer.parseInt(sc.nextLine());
    } catch (NumberFormatException e) {
        System.out.println("Error! Invalid integer. Try again.");
    }

我对您的代码做了一点修改,并将其作为一个整体发布,以避免混淆:

public static void main(String[] args) {
    // Welcome the user
    System.out.println("Welcome to the Squares and Cubes table");
    System.out.println();
    Scanner sc = new Scanner(System.in);
    String choice = "y";

    do {
        int integer = Integer.MAX_VALUE;
        while (integer == Integer.MAX_VALUE) {
            // Get input from the user
            System.out.print("Enter an integer: ");
            String input = sc.nextLine();
            try {
                integer = Integer.parseInt(input);
            }
            catch (NumberFormatException e) {
                System.out.println("Error! Invalid integer. Try again.");
            }
        }
        if(integer<0){

            System.out.println("Error! Number must be greater than 0");
            System.out.print("Enter an integer: ");
            integer = sc.nextInt();

        }

        if(integer>100){

            System.out.println("Error! Number must be less than or equal to 100");

            System.out.print("Enter an integer: ");
            integer = sc.nextInt();
        }

        // Create a header
        String header = "Number  " + "Squared " + "Cubed   " + "\n"
                +   "======  " + "======= " + "=====   ";
        System.out.println(header);

        int square = 0;
        int cube = 0;

        String row = "";
        for (int i = 1; i <= integer; i++)
        {

            square = i * i;
            cube = i * i * i;

            row = i + "       " + square + "       " + cube;
            System.out.println(row);
        }

        // See if the user wants to continue
        System.out.print("Continue? (y/n): ");
        choice = sc.next();
        System.out.println();

    } while (!choice.equalsIgnoreCase("n"));
}
publicstaticvoidmain(字符串[]args){
//欢迎用户
System.out.println(“欢迎来到正方形和立方体表”);
System.out.println();
扫描仪sc=新的扫描仪(System.in);
字符串选择=“y”;
做{
int integer=integer.MAX_值;
while(integer==integer.MAX_值){
//从用户处获取输入
System.out.print(“输入整数:”);
字符串输入=sc.nextLine();
试一试{
整数=整数.parseInt(输入);
}
捕获(数字格式){
System.out.println(“错误!无效整数。请重试”);
}
}
if(整数100){
System.out.println(“错误!数字必须小于或等于100”);
System.out.print(“输入整数:”);
整数=sc.nextInt();
}
//创建标题
字符串头=“数字”+“平方”+“立方”+“\n”
+   "======  " + "======= " + "=====   ";
系统输出打印项次(表头);
整数平方=0;
整数立方=0;
字符串行=”;
对于(int i=1;i使用此
getInput(scanner);
方法从用户处获取输入。这将处理异常并递归调用自身,直到用户输入数字

public static int getInput(Scanner sc) {
    int integer=0;
    try {
        System.out.print("Enter an integer: ");

        integer = Integer.parseInt(sc.nextLine());
    }       
    catch (Exception e) {
        System.out.println("Error! Invalid integer. Try again.");
        getInput( sc);
    }

    return integer;
}
对该函数的调用类似于
int integer=getInput(sc);

修改后,您的代码如下所示:

public class cube2 {

    public static int getInput(Scanner sc) {
        int integer=0;
        try {
            System.out.print("Enter an integer: ");

            integer = Integer.parseInt(sc.nextLine());
        }       
        catch (Exception e) {
            System.out.println("Error! Invalid integer. Try again.");
            getInput( sc);
        }

        return integer;
    }

    public static void main(String[] args)
    {
        // Welcome the user
        System.out.println("Welcome to the Squares and Cubes table");
        System.out.println();

        Scanner sc = new Scanner(System.in);
        String choice = "y";

        do
        {


            int integer = getInput(sc); // To get the Numeric input from Console

            if(integer<0){

                System.out.println("Error! Number must be greater than 0");
                System.out.print("Enter an integer: ");
                integer = sc.nextInt();

            }

            if(integer>100){

                System.out.println("Error! Number must be less than or equal to 100");

                System.out.print("Enter an integer: ");
                integer = sc.nextInt();
            }

            // Create a header
            String header = "Number  " + "Squared " + "Cubed   " + "\n"
                    +   "======  " + "======= " + "=====   ";
            System.out.println(header);

            int square = 0;
            int cube = 0;

            String row = "";
            for (int i = 1; i <= integer; i++)
            {

                square = i * i;
                cube = i * i * i;

                row = i + "       " + square + "       " + cube;
                System.out.println(row);
            }

            // See if the user wants to continue
            System.out.print("Continue? (y/n): ");
            choice = sc.nextLine();
            System.out.println();

        }
        while (!choice.equalsIgnoreCase("n"));  
    }
}

您可以使用此方法仅测试输入的值是否为有效整数。基于此结果,您可以从其他验证开始

public boolean isInt(string input) {
    try {
      Integer.parseInt(text);
      return true;
    } catch (NumberFormatException e) {
     return false;
     } 
    }

try
块中没有任何内容-为什么要使用它?您的代码没有逻辑意义。
try
用于运行异常敏感代码,并在出现异常时捕获异常…您的敏感代码在该
try
块之外,您只在其中运行
break
命令,不会失败/抛出异常例外情况。Oracle提供教程,您应该遵循它们:@Nico Haase是否有其他方法可以不用使用try-catch块来完成它@Tom我将立即阅读教程。非常感谢。您还应该阅读:you call
getInput(sc);
在异常块中,不使用递归调用返回的值执行任何操作。除了初始值“0”之外,您的代码应该如何返回其他内容一旦它进入异常分支?即使这段代码真的起作用了,使用递归来解决一些没有递归就很容易解决的问题也不是一个好的做法。如果只是为了警告提出问题的人和未来的访问者检查其他答案以获得更好的解决方案,那么就应该投反对票。
public boolean isInt(string input) {
    try {
      Integer.parseInt(text);
      return true;
    } catch (NumberFormatException e) {
     return false;
     } 
    }