Возникает баг при вычитании в калькуляторе

310
17 августа 2021, 11:00

Вот код

public class Take1_Number {
    public static Scanner oj = new Scanner(System.in);
    public static int ParsInt;
    public static int ParsInt2;
    public static String Number1;
    public static String hok;
    public static int reshenm;
    static boolean jok;
    public static void take1() {

        Number1=oj.next().toLowerCase();//берем значение введенное пользователем
        RazborChisla();
        ArifmDo arfm = new ArifmDo();
        arfm.Sweetch();
    }
    public static void RazborChisla() {
        int Num1,Num2;
        String NuMbers="",NuMbers2="";
        Pattern p = Pattern.compile("-?\\d+");
        Matcher m = p.matcher(Number1);
        while (m.find()) {
            NuMbers=NuMbers+m.group();
            NuMbers2=NuMbers2+m.group();}
        if(Number1.contains("-")) {NuMbers=NuMbers.substring(0, NuMbers.length() - 2);}else {NuMbers=NuMbers.substring(0, NuMbers.length() - 1);}
        Num1=Integer.parseInt(NuMbers);
    ParsInt=Num1;
    NuMbers2=NuMbers2.replace("-","");
    NuMbers2=NuMbers2.substring(0, NuMbers2.length()-1);
    System.out.println(NuMbers2);
    Num2=Integer.parseInt(NuMbers2);
    ParsInt2=Num2;
    reshenm=Num1-Num2;
    }
    public void Exept(){
    if(ParsInt<1 || ParsInt>10) {System.out.println("Ты ввел число больше 10, либо меньше 1);}
    }

при отнимании, он складывает, а при других операциях, все нормально

public class ArifmDo extends Take1_Number{
public void Sweetch() {
     String option=Number1;
    if(option.contains("+")) {System.out.println(ParsInt=ParsInt+ParsInt2);}
    if(option.contains("-")) {/*System.out.println((ParsInt=ParsInt-ParsInt2);*/System.out.println(reshenm);}
    // где я закомментил, происходит баг, вместо сложеия, число складывается
    if(option.contains("/")) {System.out.println(ParsInt=ParsInt/ParsInt2);}
    if(option.contains("*")) {System.out.println(ParsInt=ParsInt*ParsInt2);}
    }
}

main

public class Main {
    static char operation;
    static int firstN;
    static int secondN;
    public static void main(String[] args) {
        // TODO Auto-generated method stub TODO
        Take1_Number strok = new Take1_Number();
        strok.take1();
    }   
Answer 1

Баг тут далеко не один. Попробуйте ввести 5+7. Зачем тут наследование? Почему вы не придерживаетесь правил именования переменных и методов? ПО какому принципу вы делите код на методы? В данном случае единственное, что могу предложить - простенькое альтернативное решение. А уже его рефакторингом и усовершенствованием займетесь сами.

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Calculator {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Calculator calculator = new Calculator();
        String userInput = sc.nextLine().replace(",", ".").replace(" ", "");
        List<String> list = calculator.parseInput(userInput);
        Double result = calculator.calculate(list);
        System.out.println(userInput + "=" + result);
    }
    private List<String> parseInput(String userInput) {
        List<String> parseList = new ArrayList<>();
        StringBuilder sb = new StringBuilder();
        for (char ch : userInput.toCharArray()) {
            if (Character.isDigit(ch) || ch=='.' || ch==',') sb.append(ch);
            else {
                parseList.add(sb.toString());
                parseList.add(String.valueOf(ch));
                sb = new StringBuilder();
            }
        }
        parseList.add(sb.toString());
        return parseList;
    }
    private Double calculate(List<String> parseList) {
        Double result = null;
        String mathAction = null;
        for (int i = 0; i < parseList.size(); i++) {
            if (i % 2 == 0) result = calculate(result, parseList.get(i), mathAction);
            else mathAction = parseList.get(i);
        }
        return result;
    }
    private Double calculate(Double result, String numb, String mathAction) {
        try {
            Double number = Double.valueOf(numb);
            if (result == null) return number;
            switch (mathAction) {
                case "+": return result + number;
                case "-": return result - number;
                case "*": return result * number;
                case "/": return result / number;
                default: throw new UnsupportedOperationException("Math action " + mathAction + " not supported!");
            }
        } catch (NumberFormatException e) {
            throw new UnsupportedOperationException("User input contains unsupport characters: " + numb);
        }
    }
}
READ ALSO
Идея не видит Switch

Идея не видит Switch

Прописываю в идее эллементарный код со свитчемНо мне идея выдает,что она якобы не видит метод Switch

263
Не запускается приложение Android

Не запускается приложение Android

Ребят, помогите пожалуйстаПри запуске, написанного приложения, выскакивает уведомление, что в работе приложения произошел сбой

225
Как написать свой первый тест java?

Как написать свой первый тест java?

Подскажите пожалуйста (для прям совсем новичка) Как написать и запустить свой тест ? Например есть репозиторий https://githubcom/rojoangel/codewars/tree/master/java/are-they-the-same...

224
Вопрос про архитектуре приложения [закрыт]

Вопрос про архитектуре приложения [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

257