0

Я писал программу, которая добавляет 2 фракции. У меня 3 класса: UI, Rechnen и RechnenTest. Были представлены классы UI и RechnenTest, и мне пришлось написать класс Rechnen, который добавляет фракции. Проблема в том, что программа работает хорошо, но JUnit Test терпит неудачу. Эти классы:StackOverflowError возникает каждый раз, когда я пытаюсь исправить код

import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JTextField; 

public class UserInterface { 
    public static void main(String[] args) { 
     while (true) { 
      String[] userData = getData_Dialog(); 
      if (userData == null) 
       break; 
      int z1 = 0; 
      int n1 = 0; 
      int z2 = 0; 
      int n2 = 0; 
      try { 
       z1 = Integer.parseInt(userData[0]); 
       n1 = Integer.parseInt(userData[1]); 
       z2 = Integer.parseInt(userData[2]); 
       n2 = Integer.parseInt(userData[3]); 
      } catch (NumberFormatException e) { 
       JOptionPane.showMessageDialog(null, 
         "Bitte nur ganze Zahlen eingeben, Nenner != 0"); 
       continue; 
      } 
      try { 
       JOptionPane.showMessageDialog(null, 
         "Summe: " + Rechnen.bruchAddition(z1, n1, z2, n2)); 
      } catch (IllegalArgumentException e) { 
       JOptionPane 
         .showMessageDialog(null, 
           "Mindestens eine der Zahlen war nicht im vorgebenen Bereich"); 
      } 
     } 
     JOptionPane.showMessageDialog(null, "Danke und auf Wiedersehen!"); 
     System.exit(0); 
    } 

    private static String[] getData_Dialog() { 
     JTextField z1TF = new JTextField(); 
     JTextField n1TF = new JTextField(); 
     JTextField z2TF = new JTextField(); 
     JTextField n2TF = new JTextField(); 
     Object[] message = { "Zaehler 1", z1TF, "Nenner 1", n1TF, "Zaehler 2", 
       z2TF, "Nenner 2", n2TF }; 
     Object[] options = { "Addition", "Abbruch" }; 
     int n = JOptionPane.showOptionDialog(new JFrame(), message, 
       "Brueche Addieren", JOptionPane.YES_NO_OPTION, 
       JOptionPane.QUESTION_MESSAGE, null, options, options[0]); 
     if (n == JOptionPane.OK_OPTION) { // Zustimmung 
      return new String[] { z1TF.getText(), n1TF.getText(), 
        z2TF.getText(), n2TF.getText() }; 
     } else if (n == JOptionPane.NO_OPTION // Verneinung 
       || n == JOptionPane.CLOSED_OPTION) { // Dialogfenster 
                 // geschlossen 
      return null; 
     } else { 
      return null; 
     } 
    } 
} 

import javax.swing.JOptionPane; 


public class Rechnen { 

    public static String bruchAddition(int z1, int n1, int z2, int n2) 
      throws IllegalArgumentException { 
     int m = (z1 * n2) + (z2 * n1); 
     int n = (n1 * n2); 

     if (n1 <= 0 || n2 <= 0 || z1 < 0 || z2 < 0) { 
      throw new IllegalArgumentException(); 

     } 
     return m/ggt(m, n) + "/" + n/ggt(m, n); 

    } 


    public static int max(int x, int y) { 

     return x > y ? x : y; 
    } 


    public static int min(int x, int y) { 

     return x > y ? y : x; 
    } 

    public static int ggt(int x, int y) { 

     return (x == y) ? x : ggt(max(x, y) - min(x, y), min(x, y)); 
    } 
} 

import static org.junit.Assert.*; 
import org.junit.Test; 

public class RechnenTest { 
    @Test 
    public void test() { 
     assertEquals("Zaehler = 1 Nenner = 1", 
       rechnen.Rechnen.bruchAddition(1, 3, 2, 3)); 
     assertEquals("Zaehler = 1 Nenner = 1", 
       rechnen.Rechnen.bruchAddition(5, 8, 3, 8)); 
     assertEquals("Zaehler = 1 Nenner = 1", 
       rechnen.Rechnen.bruchAddition(10, 16, 3, 8)); 
     assertEquals("Zaehler = 1 Nenner = 3", 
       rechnen.Rechnen.bruchAddition(-1, 3, 2, 3)); 
     assertEquals("Zaehler = -1 Nenner = 2", 
       rechnen.Rechnen.bruchAddition(0, 2, -1, 2)); 
     assertEquals("Zaehler = -2 Nenner = 3", 
       rechnen.Rechnen.bruchAddition(-1, 3, 1, -3)); 
     try { 
      rechnen.Rechnen.bruchAddition(1, 1, 1, 0); 
      fail(); 
     } catch (IllegalArgumentException e) { 
      assertTrue(true); 
     } 
     try { 
      rechnen.Rechnen.bruchAddition(Integer.MAX_VALUE, 1, 1, 1); 
      fail(); 
     } catch (IllegalArgumentException e) { 
      assertTrue(true); 
     } 
     assertEquals("Zaehler = 1 Nenner = " + Integer.MAX_VALUE, 
       rechnen.Rechnen.bruchAddition(0, Integer.MAX_VALUE, 1, 
         Integer.MAX_VALUE)); 
    } 
} 

Язык немецкий.

Благодаря

+2

Как это происходит? – Taylor

+0

Каждое из ваших утверждений должно быть в их собственном модульном тесте! –

+1

Можете ли вы предоставить перевод для нас, не говорящих по-немецки? Что такое числители, а какие знаменатели в этой сигнатуре функции? 'public static String bruchAddition (int z1, int n1, int z2, int n2)' –

ответ

1

Когда я запускаю код сам, я получаю:

org.junit.ComparisonFailure: expected:<[Zaehler = 1 Nenner = ]1> but was:<[1/]1> 

Тест ожидает bruchAddition вернуть строку в другом формате. Вы можете решить эту проблему, изменив последнюю строку bruchAddition на:

return "Zaehler = " + m/ggt(m, n) + " Nenner = " + n/ggt(m, n); 

Это возвращает нас в течение первых трех утверждений, но тогда вызов Rechnen.bruchAddition(-1, 3, 2, 3) терпит неудачу с IllegalArgumentException. Это происходит потому, что bruchAddition отклоняет вызовы, где z1 или z2 < 0.

Если изменить bruchAddition принять отрицательный z1 и z2 (как тестовый модуль требует), то вы получите java.lang.StackOverflowError из-за ggt называет себя рекурсивно, и, по-видимому, не оканчивающиеся рекурсия должным образом.

Ваша техника для нахождения наибольшего общего делителя с ggt, max и min, кажется, сломана. min(1, -3) возвращается -3. Вы уверены, что это то, что вы хотите? У меня есть ощущение, что ваш алгоритм нуждается в нем, чтобы вернуть 1 в этом случае, т. Е. Наименьшее абсолютное значение.

+0

Как вы уже сказали, я изменил формат String, и он сработал. Но как я могу исправить 'java.lang.StackOverflowError'? – Maged

+0

Трудно понять, почему 'ggt' терпит неудачу, не зная, что он пытается сделать. Не могли бы вы изменить вопрос, чтобы объяснить цель 'ggt'? Тот факт, что он терпит неудачу только тогда, когда один из аргументов отрицателен, указывает на то, что в этом случае что-то не так с логикой. Возможно, было бы неплохо также отредактировать заголовок вопроса, чтобы уточнить, что тест не виноват - что-то требует исправления в тестируемом классе. – dshiga

+0

'ggt' является' самым большим общим делителем' – Maged

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