2013-09-29 6 views
0

Я только начал Java и пытаются программировать простой калькулятор:начинающие пытаются программировать простой калькулятор

Я попытался следующий:

double x, y; //inputs 
    Scanner sc = new Scanner(System.in); 
    System.out.println("x?"); 
    x = sc.nextDouble(); 
    System.out.println("y?"); 
    y = sc.nextDouble(); 

    double answer = 0; 

    System.out.println("Operation type: (+,-,*,/)"); 


    String opStr= sc.nextLine(); 
    char op = opStr.charAt(0); 


    switch(op) 
    { 
     case '+': 
      answer=x+y; 
      break; 

     case '-': 
      answer=x-y; 
      break; 

     case '*': 
      answer=x*y; 
      break; 

     case '/': 

      if (y==0) 
      { 
       System.out.println("Error, can't divide by zero"); 
      } 
      else 
      { 
       answer=x/y; 
      } 

      break; 
     default: System.out.println("Unkown operation"); 
    } // switch end 

    System.out.println("answer = " +x+op+y+"=" + answer); 

Когда я пытаюсь запустить его, я получаю следующее: (я могу ввести х и у, но после этого я получаю сообщение об ошибке.

Operation type: (+,-,*,/) 
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0 
    at java.lang.String.charAt(String.java:686) 
    at edf_1.EDF_1.main(EDF_1.java:170) 
Java Result: 1 
BUILD SUCCESSFUL (total time: 3 seconds) 

Был бы очень признателен, если кто-нибудь может помочь мне найти ошибку или вопрос!

Благодаря

NAC

+2

Вы опорожняете буфер после принятия 'x' и' y'? Если нет, 'nextLine()' сделает это для вас, и пустая строка будет назначена на 'opStr', поэтому' charAt (0) 'запустит исключение. – BackSlash

+0

См. Http://stackoverflow.com/questions/18163518/while-loop-executes-only-once/18163608#18163608 – Nayuki

+0

Также начинайте с: 'String result =" Answer = "+ x +" "+ op + "" + y + "=" + answer; System.out.println (результат); ' – BlackBox

ответ

8

nextDouble()не обрабатывать конец строки. Поэтому, когда вы снова вызываете nextLine(), в качестве ввода введите (\n), который вы ввели ранее. Таким образом, он пропускает фактический ввод и проглатывает \n с предыдущего ввода, который был пропущен nextLine(). Вы должны позвонить другому nextLine() перед реальным nextLine() (Так что он проглотит \n).

Если вы не хотите этого делать, вы должны построить другой Scanner, а не использовать тот же объект.

Именно поэтому ваш StringIndexOutOfBoundsException, opStr - это только \n на этом этапе.

0

Проблема заключается в том, что после считывания двойного значения вход сканера не пуст. Таким образом, вызов nextLine() немедленно возвращается, возвращая часть последнего ввода, которая не была проанализирована как значение с плавающей запятой (которое может быть пустым). Если вы вызываете sc.nextLine() перед запросом операции, следующий вызов sc.nextLine() читает строку, содержащую вашу операцию.

0

Я построил простейший калькулятор в мире, когда начал изучать Java. Это должно сработать отлично:

import java.util.Scanner; 
public class CalculatorProgram { 
Scanner scan = new Scanner(System.in); 
int N1; 
int N2; 
int O = 0; 
System.out.println("Enter the first number:"); 
N1 = scan.nextInt(); 
System.out.println("Enter the second number:"); 
N2 = scan.nextInt(); 
System.out.println("Press 1 for addition, 2 for subtraction, 3 for multiplication, 4 for  division 
O=scan.nextInt(); 
switch (O){ 
case 1: 
O=N1+N2; 
System.out.println(O); 
break; 
case 2: 
O=N1-N2; 
System.out.println(O); 
break; 
case 3: 
O=N1*N2; 
System.out.println(O); 
break; 
case 4: 
O=N1/N2; 
System.out.println(O); 
break; 

default: 
System.out.println("That is an invalid selection. Thank you for using this program."); 
break; 

} 
} 

} 

Youre добро пожаловать.

Смежные вопросы