【问题标题】:Im trying to add a try catch that tells the user they cant plug in negative numbers我试图添加一个尝试捕获,告诉用户他们不能插入负数
【发布时间】:2016-06-06 20:55:52
【问题描述】:

我能够添加一个 try catch 告诉用户他们不能使用 字母。但是由于某种原因,为负数添加 try catch 似乎可行。我知道 try 块是如果某些事情可能出错的地方,例如输入负数,catch 可以打印出错误消息。我认为这就是我的问题所在。与 try catch 相关的另一个问题是我习惯于用户输入 -1 来输入用户输入的内容,所以我认为它会导致逻辑问题。

tl;dr 添加 try catch 或另一个 catch 以防止用户添加负数

这不是整个程序,但它的作用是过滤掉用户输入的整数并将偶数和奇数分开。

 public static void main(String [] args)
    {
        Scanner stdin = new Scanner(System.in);//for user input
        int[] evenNum = new int [100];//Even Array up too 100
        int[] oddNum = new int[100];//Odd Array up too 100
        int evenIndex=0;//even numbers
        int input=0;//user input
        int i=0;//incrementer for arrays
        int k=0; 
        int j=0;
        String name;

        System.out.println("Type In Your Name");//Type in name 
            name = stdin.nextLine();


while ((i < oddNum.length && i < evenNum.length) && input !=-1)//100 numbers only
        {
    try{//this is what we want anything else the catch will block it and display a message


                System.out.println(name+" Enter a positive number, Enter -1 For results");
                input= stdin.nextInt();

                oddNum[i]=input;//holds input
                i++;//Increments array
            }  

                catch(Exception d){
                    System.out.println("Only Positive Numbers & no Letters Please!");
                    stdin.next();

                     }


                }

【问题讨论】:

  • 如果您的问题得到解答,请善待并支持/接受您认为正确的答案。

标签: java try-catch negative-number


【解决方案1】:

您可以在从扫描仪获取input 变量后检查它

if (input < 0) {
     System.out.println("Only Positive Numbers & no Letters Please!");
}

当从扫描仪读取数字时,您的代码不会引发任何异常。所以你不能指望当你输入一个负数时执行会跳到catch-block中。

但您也可以在input 为负数时抛出异常。这将使线程直接跳转到catch-block。在 catch-block 中,您可以打印您传递给 IllegalArgumentException 的消息

if (input < 0) {
     // this gets caught in the catch block
     throw new IllegalArgumentException("Only Positive Numbers & no Letters Please!"); 
}      
...
} catch (IllegarArgumentException e) {
    System.out.println(e.getMessage());
}

捕获Exception (java.lang.Exception) 通常是不好的做法。这是所有已检查异常的“根”,只要抛出 Exception 的任何子类,就会跳转到 catch 块。
只需捕获您期望的具体异常即可。 (在这种情况下为IllegalArgumentException。)

此外,您不应使用异常来控制程序的执行流程。

我会建议这样的事情:

do {
    System.out.println(name+" Enter a positive number, Enter -1 For results");
    try {
        input = stdin.nextInt();
    } catch (java.util.InputMismatchException e) { // if the user enters something that is not an integer
        System.out.println("Please only enter integers");
        input = Integer.MIN_VALUE; 
        stdin.next(); // consume the non-int so we don't get caught in an endless loop
    }
} while (input < -1);  // loop as long as the input is less than -1

if (input == -1) {
    // show the results here
}

这将接受正整数并提示输入,直到用户输入正数、0(零)或 -1(应显示结果)

【讨论】:

  • 如果用户输入字母,您的代码将失败。并且(目前)没有可用的InputMissmatchException(检查拼写)。不,我没有投票。
  • @Tom 谢谢。我修正了错字。如果用户输入一个字母,InputMismatchException 将被捕获,input 将被设置为 MIN_VALUE。这导致 do-while-loop 再次执行。有没有进一步的监督?
【解决方案2】:

你可以这样做:

if (input < 0) {
    throw new IllegalArgumentException();
}

现在如果数字是负数,它会抛出exception 并且catch 代码可以被执行。因为你捕获了Exception,所以所有的异常都会在这里捕获。

注意:catch块中你不需要添加stdin.next();,因为程序将从while循环的第一行继续。

【讨论】:

    【解决方案3】:

    为了让您的 catch 块捕获异常,需要从代码中抛出异常。如果是负数,input= stdin.nextInt(); 行不会抛出异常,因为整数为负是完全合法的。您将需要添加这样的 if 条件:

    input = stdin.nextInt();
    if ( input < 0 ) {
      throw new Exception("Negative number entered");
    }
    

    但有些人认为这是不好的做法,因为您使用异常来控制程序的流程。所以我给你另一个例子,你如何做到这一点而不抛出异常:

    input = stdin.nextInt();
    if ( input < 0 ) {
      System.out.println("Only Positive Numbers Please");
      continue;  // will continue from the beginning of a loop
    }
    

    【讨论】:

    • 是输入变量和 if 语句进入 try 块吗?
    • @Ronaldo 是的,代码应该放在输入行的位置,而不是 input= stdin.nextInt();
    • 不需要continue,因为它会捕获while循环中的所有异常。
    • @Bahramdun Adil continue 语句没有异常,是没有异常的代码示例。
    猜你喜欢
    • 1970-01-01
    • 2022-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 2011-10-04
    • 1970-01-01
    • 2018-10-22
    相关资源
    最近更新 更多