抓住/尝试不使用扫描仪输入不匹配异常?

时间:2015-01-29 13:29:11

标签: java java.util.scanner biginteger inputmismatchexception

好吧,我正在考虑一个CS安全类,其中包含一些基本的java编程,我们的第一个任务是使用BigInteger。但是,我们还必须提供防弹"我们的计划。虽然我的方法不是最理想的,但它对第一个输入的作用是EXCEPT。如果我输入任何input.new---();我的程序的无效输入,Aka将提示用户再次使用有效数字。但是第一个input.nextInt();仍然会收到无效的输入和崩溃,显示"java.util.InputMismatchException",然后就扫描仪进行调整。关于为什么会发生这种情况的任何想法? 附:在任何情况下,程序都不得显示错误日志。

import java.io.*;
import java.util.*;
import java.math.*;

class BigNumber{
   public static void main(String args[]){

     while(true){ 
      try{
         Scanner input = new Scanner(System.in);

         System.out.print("if you wish to exit the program type in '0,' to continue running the program type in any other value: ");
         double esc= input.nextDouble();
         if(esc == 0){ break;}
         else{System.out.println("Ok, program running...");}
         input.nextLine();

         System.out.print("Enter number a: ");
         String aValue = input.nextLine();

         System.out.print("Enter number b: ");
         String bValue = input.nextLine();

         System.out.print("Enter a number 'n': ");
         String nValue = input.nextLine();
         while (Integer.parseInt(nValue) < 1)
         {
            if (Integer.parseInt(nValue) < 1)
            {
               System.out.print("Please enter a valid number (n>1): ");
               nValue = input.nextLine();
            }
         }

         BigInteger a= new BigInteger(aValue);
         BigInteger b= new BigInteger(bValue);
         BigInteger n= new BigInteger(nValue);

         System.out.println("---------------------------");
         System.out.println("1) a xor b: " + a.xor(b));
         System.out.println("2) b xor b: " + b.xor(b));
         System.out.println("3) a xor b xor a: " + a.xor(b).xor(a));
         System.out.println(" ");
         System.out.println("4) ab mod n: " + a.modPow(b,n));
         System.out.println(" ");
         System.out.println("5) a shifted to the right by 6: " + a.shiftRight(6));
         System.out.println("6) b shifted to the left by 3: " + b.shiftLeft(3));
         System.out.println("---------------------------");

      }
      catch (NumberFormatException e){
         System.out.println("-----> Please try entering a valid number(s) <-----");
      }

    } 
  }
}

4 个答案:

答案 0 :(得分:0)

您的catch块仅处理NumberFormatException。如果您正在尝试处理所有Exception(s),那么我建议您更改此

catch (NumberFormatException e){

类似

catch (Exception e){

答案 1 :(得分:0)

nextDouble()将读取双倍值。如果parseDouble失败,则抛出InputMismatchException

这里是该类的代码:

public double nextDouble() {
    // Check cached result
    if ((typeCache != null) && (typeCache instanceof Double)) {
        double val = ((Double)typeCache).doubleValue();
        useTypeCache();
        return val;
    }
    setRadix(10);
    clearCaches();
    // Search for next float
    try {
        return Double.parseDouble(processFloatToken(next(floatPattern())));
    } catch (NumberFormatException nfe) {
        position = matcher.start(); // don't skip bad token
        throw new InputMismatchException(nfe.getMessage());
    }
}

答案 2 :(得分:0)

Oracle说

  

公共类InputMismatchException扩展NoSuchElementException   由扫描程序抛出,表示检索到的令牌没有   匹配预期类型的​​模式,或者令牌不在   预期类型的​​范围。

     

公共类NumberFormatException扩展IllegalArgumentException   抛出以指示应用程序已尝试转换a   字符串到其中一个数字类型,但字符串没有   适当的格式。

您在catch块中仅使用NumberFormatException,因此它只捕获NumberFormatException。要捕获其他异常,您必须添加其他catch块

catch (NumberFormatException e){
         System.out.println("-----> Please try entering a valid number(s) <-----");
catch (InputMismatchException e){
         System.out.println("-----> Please try entering a valid number(s) <-----");

OR 如果您使用了基本的Exception类,它将捕获任何类型的异常

catch (Exception e){
         System.out.println("-----> Please try entering a valid number(s) <-----");

答案 3 :(得分:0)

InputMismatchExceptionNumberFormatException是不同的类。他们之间没有任何关系,你的程序会抛出InputMismatchException而你正试图抓住NumberFormatException。您将需要一个InputMismatchException例外的catch块。