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

Problem z wyjątkiem w JAVA

Object Storage Arubacloud
0 głosów
577 wizyt
pytanie zadane 23 sierpnia 2016 w Java przez itcloud Gaduła (3,380 p.)

Kompletne podstawy, a od godziny nie wiem czemu to mi nie ma prawa działać ??

TestKalkulator.java


public class TestKalkulator {
	
	public static void main(String[] args){
		
		Kalkulator kalkulator = new Kalkulator();
		
		double wynik = kalkulator.dodawanie(5, 6);

		try{
			
		double wynik2 = kalkulator.dzielenie(6, 0);
		System.out.println(wynik2);
		
		}
		catch(DzieleniePrzezZero DPZ){
			System.out.println("NIE DZIELI SIE PRZEZ ZERO!");
		}
		
		
		System.out.println((int) wynik);
		
		
		
	}

}

 

Kalkulator.java

import DzieleniePrzezZero.DzieleniePrzezZero;

public class Kalkulator {
	
	public double dzielenie(double a, double b) throws DzieleniePrzezZero {
		
		if(b==0) {
			throw  new DzieleniePrzezZero();
		}
		return a/b;
	}
	

	public double dodawanie(double a, double b){
		return a+b;
	}
	
}

DzieleniePrzezZero.java

public class DzieleniePrzezZero extends Exception {

	DzieleniePrzezZero(){
		super(); //nie bardzo rozumiem, bo dziala i bez tego, czemu robi sie takie odwolanie do konstruktora domyslnego klasy bazowej? (Exception)
		System.out.println("konstruktor DzieleniePrzezZero");
	}
	
}

 

1
komentarz 23 sierpnia 2016 przez KubenQPL Maniak (62,820 p.)
Może więcej szczegółów, co miało się stać a co się stało nie tak?
komentarz 23 sierpnia 2016 przez itcloud Gaduła (3,380 p.)
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
    Unhandled exception type DzieleniePrzezZero
    Unreachable catch block for DzieleniePrzezZero. This exception is never thrown from the try statement body

    at TestKalkulator.main(TestKalkulator.java:12)

3 odpowiedzi

+1 głos
odpowiedź 23 sierpnia 2016 przez mbabane Szeryf (79,280 p.)
edycja 23 sierpnia 2016 przez mbabane

konstruktor klasy  DzieleniePrzezZero musi być publiczny bo wywolujesz go poza pakietem - bez modyfikatora dostepnosci (public, protected lub private) taki konstruktor ma dostep tylko w tym samym pakiecie.

a do pliku klasy TestKalkulator rowniez trzeba wstawic 
import DzieleniePrzezZero.DzieleniePrzezZero; 
(chyba ze pominales to piszac post lub u Ciebie jest w tym samym pakiecie co DzieleniePrzezZero)

 

po tych poprawkach co nadmienilem u mnie dziala

u mnie IDE juz wykrylo ze sa te bledy - piszesz programy w notatniku?

komentarz 23 sierpnia 2016 przez itcloud Gaduła (3,380 p.)

Super - zadziałało. Pisze w Eclipsie.

Ale nie rozumiem tego import DzieleniePrzezZero.DzieleniePrzezZero;

Gdybym na początku każdego plików wstawił deklarację package xxx  - czyli każdy plik byłby w ramach tego samego pakietu, to byłoby ok? Poza tym co oznacza to DzieleniePrzezZero [kropka] DzieleniePrzezZero? Przecież to jest jeden plik z klasą o takiej nazwie.

W ogóle jak mam być szczery nie czaję na chwilę obecną tych wyjątków. Samo try - catch jest dla mnie oczywiste.. i nawet mógłbym na tym poprzestać pisząc program - po co to throws - throw? Bo w TRY daje kod, który może spowodować błąd i jeśli tak się stanie, program kończy się tym co w sekcji Catch.   A te throws - throw to dla mnie istna magia. Teorie niby znam - throws daję w definicji (nagłówku) metody czyli daję kompilatorowi do zrozumienia, że tu może wystąpić wyjątek (czyli defacto jakiś obiekt, który mogę stworzyć). A niżej w tej samej metodzie poprzez throw tworzę już obiekt danego wyjątku, bo właśnie występuje błąd. No i jak do tego powiazać to try - catch? To co pisałem wyżej to na przykładzie innego kodu, ale jakoś nie do końca to rozumiem.

Mógłbyś mi to wytłumaczyć, proszę ?

komentarz 23 sierpnia 2016 przez mbabane Szeryf (79,280 p.)
niestety poki co jakos nie mialem okazji sie zaglebic w szczegoly dotyczace wyjatkow, wiec moge nastrzelac glupot na ich temat - poszukaj w tutorialach, ksiazkach, na youtubie jest chyba niezly kurs podstaw javy

I musisz, niestety, wrocic do podstaw bo skoro nie ogarniasz pakietow - a to jest dosc proste.
komentarz 23 sierpnia 2016 przez itcloud Gaduła (3,380 p.)
Ok, z pakietami rozumiem: bo był stworzony pakiet o takiej nazwie DzieleniePrzezZero i wewnątrz pakietu plik. A defaultowy pakiet to cała reszta w folderze projektu. W każdym razie dzięki za podpowiedzi.

ps. chociaż nie rozumiem, czemu w defaultowym pakiecie również jest ten plik DzieleniePrzezZero.

https://s3.postimg.org/z5d8pejgz/Clipboard02.jpg
komentarz 23 sierpnia 2016 przez mbabane Szeryf (79,280 p.)

moze przypadkiem go stworzyles, albo skopiowales czy cos

 

ale wzialem sie teraz za te wyjatki i moge Ci juz podpowiedziec, ze thorws przy nazwie metody daje informacje ze ta metoda moze zwrocic jakis tam wyjatek (moze ich zwracac kilka wtedy oddziela sie je przecinkami). i jesli chcemy jej uzyc to albo musimy uzyc try-catch albo znowu zastosowac throws z tymi samymi wyjatkami, no do metody main nie mozna tego zastosowac wiec pozostaje tylko try-catch. Znaczy sie w Twoim kodzie mozna to tak zobrazowac: stworzyles metode dzielenie i ta metoda moze (bo nie musi) wyrzucic wyjatek DzieleniePrzezZero i teraz ta metoda podczas proby wywolania mowi "hej uwazaj moge zwrocic wyjatek DzieleniePrzezZero - musisz to jakos obsluzyc" np. poprzez try-catch.

 

Ale rownie dobrze mozemy dodac jakas inna metode, ktora bedzie korzystala z metody dzielenie:
 

import DzieleniePrzezZero.DzieleniePrzezZero;
 
public class Kalkulator 
{ 
    public double dzielenie(double a, double b) throws DzieleniePrzezZero
   { 
        if(b==0) 
        {
            throw  new DzieleniePrzezZero();
        }
        return a/b;
    }
     
   public double dodawanie(double a, double b){
        return a+b;
    }
    
    public void jakasMetoda() throws DzieleniePrzezZero
    {
        double wyn = dzielenie(1.2, 1);
    }
     
public void uzycieJakasMetoda()
    {
        try
        {
            jakasMetoda();
        } catch (DzieleniePrzezZero ex)
        {
            System.out.println("Dzielenie przez zero");
        }
    }

public void innaMetoda()
    {
        try
        {
            double wyn = dzielenie(1.2, 1);
        } catch (DzieleniePrzezZero ex)
        {
            System.out.println("Dzielenie przez zero");
        }
    }

}

wowczas mozna zastosowac kolejny raz throws i pozniej korzystajac z metody jakasMetod() probowac wylapac wyjatek ktory ona moze rzucic, ale mozna tez od razu zastosowac try-catch tak jak w przykladzie w innaMetoda()

Narazie tyle, mam nadzieje ze Ci nie zamotalem tego, jak cos to wertuj tutoriale.

 

komentarz 23 sierpnia 2016 przez itcloud Gaduła (3,380 p.)
spoko - dzięki ale i tak tego nie czaję za bardzo. Muszę jeszcze się podszkolić.
0 głosów
odpowiedź 23 sierpnia 2016 przez KubenQPL Maniak (62,820 p.)

Problemem może być to że nigdzie nie wyrzucasz tego swojego wyjątku, w try powinnieneś go gdzieś wywołać 

throw new DzieleniePrzezZero("srututu");

wtedy zostanie wywołany catch. A "super();" wywołuje ci konstruktor klasy z której dziedziczysz.

komentarz 23 sierpnia 2016 przez itcloud Gaduła (3,380 p.)
Nie bardzo rozumiem.

Co do konstruktora a dokładnie super() sam napisałem w komentarzu:

> czemu robi sie takie odwolanie do konstruktora domyslnego klasy bazowej?

więc ja wiem, co OZNACZA super(). Pytanie inaczej brzmiało, czemu się to w tym konkretnym przypadku stosuje? Bez tego też przecież zadziała.

A co do głównego pytania: co mam dokładnie poprawić w kodzie? Przecież wyjątek wyrzucam tutaj:

        if(b==0) {
            throw  new DzieleniePrzezZero();
        }

Jedyna różnica, że podałeś po throw konstruktor ale jednoargumentowy (String). Chyba że czegoś nie rozumiem. Bład jest nadal bez zmian.
0 głosów
odpowiedź 24 sierpnia 2016 przez itcloud Gaduła (3,380 p.)

Czytam sobie to:

http://4programmers.net/Java/Wyj%C4%85tki

I jest napisane: "Dla obsługi wyjątków weryfikowalnych wprowadzono cztery słowa kluczowe: throw, throws, try, catch i finally. Słowo kluczowe throw służy do jawnego zgłaszania wyjątków nieweryfikowalnych i występuje w instrukcji throw o składni throw wyrażenie;"

No i już kompletnie nie wiem co o tym myśleć. Mam wrażenie, jakby try-catch było do pojedynczej instrykcji, a throw-throws do całych metod, no ale podobno wyjątki nieweryfikowalne w ogóle nie można obsłużyć. Stąd nie wiem już o co chodzi. Nadal nikt mi tego nie wytłumaczył łopatologicznie.

komentarz 27 sierpnia 2016 przez itcloud Gaduła (3,380 p.)
Może komuś się przyda. To na dzisiaj, do czego doszedłem, a na co nikt nie był mi w stanie tutaj odpowiedzieć.

Throws - informuję kompilator, że w tej metodzie może wystąpić wyjątek. Np. mam tam odczytywanie danych z pliku w implementacji metody no i nie mam co poprawiać w kodzie, po prostu wyjątek BRAKU PLIKU może wystąpić kiedys tam, jak ktoś skasuje plik. Więc wyjątek tego typu nadaje się do obsłużenia (checked), co innego jakby chodziło o przekroczenie zakresu tablicy (tu należy POPRAWIĆ kod).

throw - gdy występuje wyjątek, mogę w tym momencie utworzyć własny obiekt (z klasy) dot. obsługi tego wyjątku. ALE GDZIEŚ on będzie musiał być obsłużony try/catchem.

try/catch - no a tutaj już konkretnie WYŁAPUJĘ (obsługuję) ten obiekt - albo tak jak w Twoim kodzie przykładowym będą to obiekty WBUDOWANE, dziedziczące po Thrwowable, albo będą to jakieś nietypowe, napisane przez programistę obiekty jego własnych klas wyjątków.

Podobne pytania

0 głosów
0 odpowiedzi 125 wizyt
pytanie zadane 28 lipca 2019 w Java przez Uwegi Początkujący (430 p.)
0 głosów
0 odpowiedzi 116 wizyt
0 głosów
0 odpowiedzi 75 wizyt

92,546 zapytań

141,387 odpowiedzi

319,503 komentarzy

61,930 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!

...