Исключение в потоке "main" java.lang.StringIndexOutOfBoundsException: индекс строки вне диапазона: 0 в java.lang.String.charAt (String.java:658) - PullRequest
0 голосов
/ 03 октября 2018

Я должен сделать простой калькулятор, который запрашивает допустимый оператор и останавливается, когда оператор является символом 'S'.Затем он запрашивает 2 числа для расчета.При первом вычислении он работает без ошибок, но как только он пытается запросить следующий оператор, я получаю следующую ошибку:

Исключение в потоке "main" java.lang.StringIndexOutOfBoundsException: String index outдиапазона: 0 в java.lang.String.charAt (String.java:658) в Main.main (Main.java:16)

import java.util.Scanner;

public class Main {

  public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    boolean geldigeOperator;
    double getal1;
    double getal2;
    char operator;

    do {
        System.out.print("Operator (S = stoppen): ");
        String s = input.nextLine();
        //pakt het eerste character van de string die is ingevoerd door de gebruiker
        operator = s.charAt(0);
        geldigeOperator = isGeldigeOperator(operator);
        if (!geldigeOperator) {
            System.out.println("Operator is ongeldig");
            System.out.println("");
        } else {
            System.out.print("Eerste getal: ");
            getal1 = input.nextDouble();
            System.out.print("Tweede getal: ");
            getal2 = input.nextDouble();
            printBerekening(operator, getal1, getal2);
            System.out.println();
        }
    } while (!(operator == 'S'));
}

public static boolean isGeldigeOperator(char karakter) {
    if (karakter == '+' || karakter == '-' || karakter == '*' || karakter == '/' || karakter == '%') {
        return true;
    } else {
        return false;
    }
}

public static void printBerekening(char operator, double getal1, double getal2) {
    double result = 0;
    switch(operator) {
        case '+':
            result = getal1 + getal2;
            System.out.println(getal1 + " + " + getal2 + " = " + result);
            break;
        case '-':
            result = getal1 - getal2;
            System.out.println(getal1 + " - " + getal2 + " = " + result);
            break;
        case '*':
            result = getal1 * getal2;
            System.out.println(getal1 + " * " + getal2 + " = " + result);
            break;
        case '/':
            result = getal1 / getal2;
            System.out.println(getal1 + " / " + getal2 + " = " + result);
            break;
        case '%':
            result = getal1 % getal2;
            System.out.println(getal1 + " % " + getal2 + " = " + result);
            break;
    }
  }
}

Рабочий код должен давать следующие результаты:

Picture of expected results

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Переместите создание сканера в цикл do.. while.Таким образом, любой избыточный ввод, который у вас есть в конце операции, уничтожается, и вы получаете новый блестящий сканер при каждом запуске новой итерации.

do {
        Scanner input = new Scanner(System.in);
        System.out.print("Operator (S = stoppen): ");
        String s = input.nextLine();
        ....
} while (!(operator == 'S'));
0 голосов
/ 03 октября 2018

Добавьте input.nextLine(); в конце вашего блока else.

Проблема здесь в том, что когда вы вызываете input.nextLine(), он, наконец, использует всю строку вместе с новой строкой, но когда вы используете input.nextDouble(), он принимает только номер, а не символ newLline вконец, следовательно, когда вы вызываете nextLine() после nextDouble(), nextLine() только для чтения newLine символа, и вы получаете ошибку.

...