1

좋아요. 그래서 저는 기본적인 자바 프로그래밍이있는 CS 보안 클래스를 사용하고 있습니다. 우리의 첫번째 과제는 BigInteger입니다. 그러나 우리는 또한 우리 프로그램을 "총알 증명"해야합니다. 제 방법이 가장 이상적이지는 않지만, 첫 번째 입력을 제외하고는 작동합니다. 일명 input.new---(); 중 하나에 대해 잘못된 입력을 입력하면 내 프로그램에서 유효한 숫자로 다시 시도하라는 메시지가 표시됩니다. 하지만 첫 번째 input.nextInt();은 여전히 ​​유효하지 않은 입력 및 충돌을 받아 "java.util.InputMismatchException"을 표시 한 다음 스캐너에 관한 정보를 제공합니다. 왜 이런 일이 일어나고 있는지에 대한 아이디어가 있습니까? p.s. 어떤 상황에서도 프로그램에서 오류 로그를 표시하면 안됩니다.스캐너로 입력 불일치 예외를 잡아/시도하지 않습니까?

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) <-----"); 
     } 

    } 
    } 
} 

답변

0

오라클은

공용 클래스 InputMismatchException를 검색 토큰 패턴 일치하지 않는 것을 나타 내기 위해 스캐너에 의해 슬로우 예외 : NoSuchElementException 확장 말한다 또는 예상되는 형식의 토큰이 범위를 벗어났습니다.

공용 클래스는 NumberFormatException는 IllegalArgumentException가 응용 프로그램이 수치 형으로 문자열을 변환하려고 한 것을 나타 내기 위해서 Throw하지만, 문자열이 의 형식이 올바르지 않은 확장합니다. 그것은 단지 NumberFormatException를 잡을 수 있도록

당신은 catch 블록 만 NumberFormatException을 사용했다. 다른 예외를 잡기 위해 당신은 당신이 기본 예외 클래스를 사용하는 경우가

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

귀하의 catch 블록은 NumberFormatException을 처리합니다. 당신이 처리하려는 경우 모든 Exception (들) 나는 당신이 double 값을 읽어

catch (Exception e){ 
0

nextDouble() 같은 것을이

catch (NumberFormatException e){ 

을 변경하는 것이 좋습니다. 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()); 
    } 
} 
0

InputMismatchExceptionNumberFormatException 다른 클래스입니다 예외의 종류를 잡을 것입니다 다른 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) <-----"); 

또는 을 추가해야합니다. 그 (것)들 사이 아무 관계도 없다, 당신의 프로그램은 InputMismatchException를 던지고 NumberFormatException를 붙잡는 것을 시도하고있다. InputMismatchException 예외에 대한 또 다른 catch 블록이 필요합니다.