• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dlaczego nie mogę dopisać wyniku dzielenia dwóch intów do innej zmiennej typu int?

Object Storage Arubacloud
0 głosów
493 wizyt
pytanie zadane 19 kwietnia 2015 w Java przez KoRnish Nowicjusz (120 p.)

Witam.

Mam problem z pewnym prostym programikiem, który piszę aby ćwiczyć swoje pączkujące umiejętności programowania w Javie.

Program składa się z dwóch klas:

- Ulamek

- Test

Pierwsza z klas, służy do tworzenia obiektów przechowujących ułamki zwykłe (w formacie licznik/mianownik), oraz umożliwia wykonywanie na nich prostych operacji arytmetycznych.

Drugi to oczywiście tylko klasa testowa, służaca do sprawdzania poprawności działania klasy Ułamek.

Kod klasy Ułamek wygląda tak:

public class Ulamek{
    int licznik, mianownik;
    int cal = licznik/mianownik;
    
    Ulamek(int a, int b){
        licznik = a;
        mianownik = b;
    }
    
    void pomnoz(Ulamek u){
        licznik*=u.licznik;
        mianownik*=u.mianownik;
    }
    void dodaj(Ulamek u){
        licznik = licznik * u.mianownik + mianownik * u.licznik;
        mianownik*=u.mianownik;
    }
    double getWartosc(){
        return (double)licznik/mianownik;
    }
    double getCzesccalkowita(){
        return cal;
        //return licznik/mianownik;
    }
    
    void wyswietl(){
        System.out.println("Ulamek: "+licznik+"/"+mianownik+"\nWartosc: "+getWartosc()+"\nCzesc calkowita: "+getCzesccalkowita());
    }
}

Moje pytanie brzmi - Dlaczego część całkowitą mogę uzyskać jako bezpośredni wynik działania metody, ale już nie jako wynik działania przypisany do zmiennej cal? Przy próbie zainicjowana zmiennej cal działaniem licznik/mianownik (zarówno z rzutowaniem (int), jak i bez niego), kompilator wyrzuca mi bład:

Exception in thread "main" java.lang.ArithmeticException: / by zero                                                                                                                                                                            

        at Ulamek.<init>(Ulamek.java:3)                                                                                                                                                                                                        

        at Test.main(Test.java:3)  

Może ktoś wie w czym tkwi problem?

1 odpowiedź

+2 głosów
odpowiedź 19 kwietnia 2015 przez Mateusz Dalgiewicz Mądrala (5,270 p.)

Witam,

Problem polega na tym, że w chwili kiedy próbujesz przypisać wartość do zmiennej cal za pomocą wyrażenia (licznik/mianownik) pola te nie są jeszcze zainicjalizowane (O czym śiwadczy nawet sam komunikat błędu ze dzielisz przez zero). Zauważ że jeśli przypiszesz w definicji klasy jakieś domyślne wartości dla pół licznik i mianownik np: licznik=1, mianownik=2 problem już sie nie pojawi. Natomiast w twoim przypadku rozwiązaniem problemu jest inicjalizacja pola cal w konstruktorze, tuż po przypisaniu wartości do licznika i mianownika:
 

public Ulamek(int licznik, int mianownik){
  this.licznik  = licznik;
  this.mianownik = mianownik;
  this.cal = licznik/mianownik;
}

komentarz 19 kwietnia 2015 przez KoRnish Nowicjusz (120 p.)
Super, teraz wszystko jasne, dzięki :)

Podobne pytania

0 głosów
2 odpowiedzi 1,356 wizyt
pytanie zadane 22 sierpnia 2020 w Java przez Bakkit Dyskutant (7,600 p.)
0 głosów
2 odpowiedzi 225 wizyt
pytanie zadane 11 listopada 2017 w C i C++ przez scoorix Nowicjusz (140 p.)

92,556 zapytań

141,404 odpowiedzi

319,561 komentarzy

61,942 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...