2017-08-31 9 views
0

私は基本的な電卓プログラムを作ったと私はこの例外を取得しています:スキャナ:java.util.Scanner.next(不明なソース)問題

java.util.InputMismatchException java.util.Scannerを.next(不明なソース)

コードはうまく動作しますが、例外が発生した場合には、Scannerを使用して入力をユーザーに許可しません。私は間違って何をしているのですか?どうすれば修正できますか?

package string; 

import java.util.Scanner; 
import java.lang.Exception; 

public class Calculator { 

double sum(double a,double b) 
{ 
    double c =a+b; 
    return c; 
} 

double subtract(double a,double b) 
{ 
    double c= a-b; 
    return c; 
} 

double multiply(double a,double b) 
{ 
    double c=a*b; 
    return c; 
} 

double divide(double a,double b) 
{ 
    double c=a/b; 
    return c; 
} 


public static void main(String[] args) { 
Calculator f= new Calculator(); 
int choice; 
int z; 

Scanner s1 =new Scanner(System.in); 


do{ 
    try{ 

System.out.println("Welcome To Mini Calculator: Which Function Do You Want To Use"); 
System.out.println("1.Addition"); 
System.out.println("2.Subtraction"); 
System.out.println("3.Multiplication"); 
System.out.println("4.Division"); 
System.out.println(); 
System.out.print("Please Enter Your Choice Number: "); 
choice = s1.nextInt(); 

System.out.println(); 

switch(choice){ 
case 1: 
    System.out.print("Please Enter The First Number: "); 
    double x= s1.nextDouble(); 
    System.out.println(); 
    System.out.print("Please Enter The Second Number: "); 
    double y= s1.nextDouble(); 
    double u = f.sum(x,y); 
    System.out.println(); 
    System.out.println("The Sum Of Two Numbers is: " + u); 
    break; 
case 2: 
    System.out.print("Please Enter The First Number: "); 
    double q= s1.nextDouble(); 
    System.out.println(); 
    System.out.print("Please Enter The Second Number: "); 
    double w= s1.nextDouble(); 
    double i= f.subtract(q,w); 
    System.out.println(); 
    System.out.println("The Substraction Of Two Numbers is: "+i); 
    break; 
case 3: 
    System.out.print("Please Enter The First Number: "); 
    double e= s1.nextDouble(); 
    System.out.println(); 
    System.out.print("Please Enter The Second Number: "); 
    double r= s1.nextDouble(); 
    double o= f.multiply(e, r); 
    System.out.println(); 
    System.out.println("The Multiplication Of Two Numbers " + o); 
    break; 
case 4: 
    System.out.print("Please Enter The First Number: "); 
    double t= s1.nextDouble(); 
    System.out.println(); 
    System.out.print("Please Enter The Second Number: "); 
    double k= s1.nextDouble(); 
    double p= f.divide(t,k); 
    System.out.println(); 
    System.out.println("The Divison of Two Numbers is: "+ p); 
    break; 
default:System.out.println(); 
    System.out.println("Please Enter a Valid Choice from 1 to 4"); 
} 
} 
catch(Exception e) { 
    System.out.println("Input error: You have entered wrong input"); 
    System.out.println("Please restart the program"); 

    } 
    System.out.println(); 
    System.out.println("Do You Want To perform Another Functionality?"); 
    System.out.println("Press 1 to Continue and Press 2 to Terminate The Program"); 
    z= s1.nextInt(); // Issue comes here. It runs fine without exception. When exception occurs in above code ,it doesn't take input and shows another exception 
} 
while(z==1); 

System.out.println(); 
System.out.println("Thank You For Using Calculator"); 
s1.close(); 

} 
} 
+0

あなたの入力として何を試しましたか? – konsolas

+0

私は試してみました – azro

+0

例外を投げている 'nextFoo()'メソッドは入力を消費しないので、catchブロックの 'nextInt()'コールは同じ悪い入力で窒息しているからです。詳細については、https://stackoverflow.com/questions/13102045/scanner-is-skipping-nextline-after-using-next-nextint-or-other-nextfooを参照してください。 – azurefrog

答えて

1

間違った入力を入力すると、それはcatchに行くが、入力がまだここにいるので、z= s1.nextInt();がcatchedされていない別の例外をスローし、それが

をクラッシュだから、あなたが入力を読み取る必要がありますスキャナをクリアするキャッチ、:

} catch (Exception e) { 
    System.out.println("Input error: You have entered wrong input"); 
    System.out.println("Please restart the program"); 
    s1.nextLine(); 
} 

また、あなたは、コードの重複がたくさんあるし、何を意味する変数名、これは非常に良い比較例ではありません私はあなたの全体を置き換えるためにこのような提案をしていますswitch{ ... }

System.out.println(); 
System.out.print("Please Enter The First Number: "); 
double numb1 = s1.nextDouble(); 
System.out.println(); 
System.out.print("Please Enter The Second Number: "); 
double numb2 = s1.nextDouble(); 
double res; 
String operation = ""; 

switch (choice) { 
    case 1: 
     res = f.sum(numb1, numb2); 
     operation = "Sum"; 
     break; 
    case 2: 
     res = f.subtract(numb1, numb2); 
     operation = "Substraction"; 
     break; 
    case 3: 
     res = f.multiply(numb1, numb2); 
     operation = "Multiplication"; 
     break; 
    case 4: 
     res = f.divide(numb1, numb2); 
     operation = "Divison"; 
     break; 
    default: 
     res = 0; 
     System.out.println(); 
     System.out.println("Please Enter a Valid Choice from 1 to 4"); 
} 

System.out.println(); 
System.out.println("The " + operation + " Of Two Numbers is: " + res); 
+0

azro - 説明をありがとうございます。今は理にかなっている。私はstackoverflow上の問題のこの種の15の記事のように読んだが、解決策のみ、説明を見つけることができませんでした。問題の背後にある理由とその解決策を教えてくれてありがとう:)非常に感謝しています。 –

+0

@ TarunjeetSinghSalh no prob;)そしてコードの重複を避けることを覚えておいてください.2-3行が同じであれば、一度だけ検索してください;)投票についても考えてください/この回答を受け入れる;) – azro

+0

優れた標準を維持しています。私はそれを投票した。私の評判は15歳以下です。今すぐ参加しました。私の投票は記録されますが、見えません。私は今からstackflowになるでしょう:)もう一度良い先生、 –

関連する問題