• 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

Aruba Cloud PRO i VPS, Openstack, VMWare, MS Hyper-V
0 głosów
479 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,860 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,260 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,260 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,260 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,860 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 100 wizyt
pytanie zadane 28 lipca 2019 w Java przez Uwegi Początkujący (430 p.)
0 głosów
0 odpowiedzi 73 wizyt
0 głosów
0 odpowiedzi 50 wizyt

89,759 zapytań

138,363 odpowiedzi

309,422 komentarzy

59,673 pasjonatów

Advent of Code 2022

Top 15 użytkowników

  1. 908p. - Argeento
  2. 877p. - nidomika
  3. 851p. - Michal Drewniak
  4. 848p. - Mikbac
  5. 846p. - rucin93
  6. 838p. - Łukasz Eckert
  7. 835p. - ssynowiec
  8. 822p. - TheLukaszNs
  9. 794p. - JMazurkiewicz
  10. 787p. - Hubert Chęciński
  11. 786p. - adrian17
  12. 775p. - Jarosław Roszyk
  13. 760p. - Mawrok
  14. 756p. - overcq
  15. 752p. - Vinox
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

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

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...