logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak obsłużyć wyjątek dzielenia przez zero w Javie? Dodanie komunikatu dla użytkownika

Fellert 22 Kwi 2011 15:36 3002 16
REKLAMA
  • #1 9428467
    Fellert
    Poziom 10  
    Posty: 55
    Ocena: 3
    Witam potrzebuję pomocy z dopisaniem wyjątku w javie do tego programu.
    chodzi o to ze jak użytkownik wpisze zero wyrzucało mu ze wpisał niedozwoloną liczbę albo przy wykonywaniu obliczeń.
    a oto kod programu napisany przy użyciu NetBeans 7.0

    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package bryly;
    
     
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.*;
    
    public class bryly{
    
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
              oknoglowne oknopr = new oknoglowne();
        }
        
     
            private static class oknoglowne {
                
            String lista1 [] = {"","Czworościan", "Prostopadłościan", "Kula","Stożek"};
            JComboBox Jlista;
            JTextField pole1, pole2, pole3;
            JLabel tpole1,tpole2,tpole3, tpole4, wpole1, wpole2;
     
     
            public oknoglowne()
                    
            {
                JFrame okno = new JFrame("Bryłki");
              okno.setResizable(false);
                okno.setSize(500, 400);
               
                okno.setLocationByPlatform(true);
                okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       
     
                JPanel panel = new JPanel();
                panel.setLayout(null);
     
    //dodanie JComboBox z listą elementów
                Jlista = new JComboBox (lista1);
                Jlista.setBounds(50, 15, 200, 25);
     
             
                 
                    JButton klik = new JButton ("Oblicz");
                klik.setBounds(50, 200, 200, 35);
                 klik.setVisible(true);
     
    //dodanie JLabel do opisywania tekstów
                tpole1 = new JLabel("Tu podajemy dane różne od zera");
                tpole1.setBounds(20, 50, 200, 25);
                tpole2 = new JLabel("Tu podajemy dane różne od zera ");
                tpole2.setBounds(20, 75, 200, 25);
                tpole3 = new JLabel("Tu podajemy dane różne od zera");
                tpole3.setBounds(20, 100, 200, 25);
                tpole4 = new JLabel("Program do obliczania objętości i pola całkowitego brył geometrycznych");
                tpole4.setBounds(10, 50, 600, 525);
    //dodanie JLabel do opisywania tekstów
                wpole1 = new JLabel("");
                wpole1.setBounds(20, 125, 300, 45);
                wpole2 = new JLabel("Przycisk do obliczen ↓");
                wpole2.setBounds(20, 150, 300, 45);
     
    //dodanie JTextFiled okienka do wprowadzania danych
                pole1 = new JTextField ("");
                pole1.setBounds(255, 50, 100, 25);
                pole2 = new JTextField ("");
                pole2.setBounds(255, 75, 100, 25);
                pole3 = new JTextField ("");
                pole3.setBounds(255, 100, 100, 25);
    // nasłuchiwanie listy JComboBox
                Jlista.addActionListener(new ActionListener() {
     
                    public void actionPerformed(ActionEvent e) {
                        int nr_lista1 = Jlista.getSelectedIndex();
     
                        switch(nr_lista1){
                            
                            case 0://pierwsza figura
                                wpole1.setText("Wybierz figurę!!!");
                                pole1.setText("");
                                pole2.setText("");
                                pole3.setText("");
                                 pole3.setVisible(false);
                                 pole2.setVisible(false);
                                 pole1.setVisible(false);
                                 tpole1.setText("");
                                  tpole2.setText("");
                                  tpole3.setText("");
                                   wpole2.setText(""); 
                                
                                  
                                 
                                break;
    
                            case 1://pierwsza figura
                              pole1.setText("");
                                wpole1.setText("Pole całkowite =");
                             wpole2.setText("Objętość = ");
                             tpole1.setText("Długość boku a =");
                                 tpole2.setText("");
                                tpole3.setText("");
                                  pole3.setVisible(false);
                                  pole2.setVisible(false);
                                      pole1.setVisible(true);
                                      
                                   
                                    
                break;
                            case 2://druga figura
                                  pole1.setText("");
                                pole2.setText("");
                                pole3.setText("");
                                wpole1.setText("Pole =");
                                tpole1.setText("Długość boku a =");
                                  tpole2.setText("Długość boku b =");
                                tpole3.setText("Długość boku c =");
                                 wpole1.setText("Pole całkowite =");
                                 wpole2.setText("Objętość = ");
                                 pole2.setVisible(true);
                                 pole3.setVisible(true);
                                break;
                                
                            case 3://druga figura
                                  pole1.setText("");
                             
                                wpole1.setText("Pole całkowite =");
                                tpole1.setText("Promień r=");
                                 pole3.setVisible(false);
                                 pole2.setVisible(false);
                                 wpole2.setText("Objętość = ");
                                 tpole2.setText("");
                                 tpole3.setText("");
                           break;
                                
                            case 4:
                                  pole1.setText("");
                                pole2.setText("");
                                pole3.setText("");
                                   wpole1.setText("Pole =");
                                tpole1.setText("Długość bopromienia r =");
                                  tpole2.setText("Długość tworzącej      l =");
                                tpole3.setText("Wysokość                     h = ");
                                 wpole1.setText("Pole całkowite =");
                                 wpole2.setText("Objętość = ");
                                 pole2.setVisible(true);
                                 pole3.setVisible(true);
                          
                                break;
                                
                           
                        }
     
                    }
                });
     
    // dodanie przycisku
              
    // nasłuchiwanie przycisku
                klik.addActionListener(new ActionListener() {
                    private int WHITE;
     
                    public void actionPerformed(ActionEvent e) {
                        int nr_lista = Jlista.getSelectedIndex();
    //
                        switch(nr_lista){
                            case 1://pierwsza figura
                                double pole_w1 =((1.414213 * Double.parseDouble(pole1.getText()) * Double.parseDouble(pole1.getText())*Double.parseDouble(pole1.getText()))/12);
                                wpole1.setText("Pole całkowite =     " + pole_w1);
                                  double pole_w1a =(1.442249 * Double.parseDouble(pole1.getText()) * Double.parseDouble(pole1.getText()));
                                wpole2.setText("Objętość =               " + pole_w1a);
                                break;
                            case 2://druga figura
                                double pole_w2 =(2 * ((Double.parseDouble(pole1.getText()) * Double.parseDouble(pole2.getText()))) +(2* Double.parseDouble(pole2.getText()) * Double.parseDouble(pole3.getText()))) + (2 * Double.parseDouble(pole1.getText()) * Double.parseDouble(pole3.getText()));
                                wpole1.setText("Pole całkowite = "+ pole_w2);
                                double pole_w2a = (Double.parseDouble(pole1.getText()) * Double.parseDouble(pole2.getText()) * Double.parseDouble(pole3.getText()) );
                                wpole2.setText("Objętość =            "+ pole_w2a);
                                break;
                            case 3://druga figura
                                 double pole_w3 = (4*3.14*(Double.parseDouble(pole1.getText()) * Double.parseDouble(pole1.getText()) * Double.parseDouble(pole1.getText())));
                                wpole1.setText("Pole całkowite = "+ pole_w3 );
                                double pole_w3a = (1.333333*3.14*(Double.parseDouble(pole1.getText()) * Double.parseDouble(pole1.getText()) * Double.parseDouble(pole1.getText())));
                                wpole2.setText("Objętość =            "+ pole_w3a );
                                break;
                            case 4:
                                
                                double pole_w4 = (3.14 * Double.parseDouble(pole1.getText()) * (Double.parseDouble(pole1.getText()) + Double.parseDouble(pole3.getText())));
                                wpole1.setText("Pole calkowite = "+ pole_w4 );
                                double pole_w4a = (0.3333 * 3.14 * Double.parseDouble(pole1.getText()) * Double.parseDouble(pole1.getText()) * Double.parseDouble(pole3.getText()));
                                wpole2.setText("Objętość =            "+ pole_w4a );
                           
                                break;
                        }
                    }
                });
     
     
     
                panel.add(Jlista);
                panel.add(tpole1);
                panel.add(tpole2);
                panel.add(tpole3);
                panel.add(tpole4);
                panel.add(pole1);
                panel.add(pole2);
                panel.add(pole3);
                panel.add(wpole1);
                panel.add(wpole2);
                panel.add(klik);
     
     
                okno.add(panel);
                okno.setVisible(true);
     
            }
     
        }
     
    }
        
    
    
  • REKLAMA
  • Pomocny post
    #2 9428513
    McMonster
    Poziom 32  
    Posty: 1942
    Pomógł: 182
    Ocena: 57
    Jeśli to nie musi być koniecznie obsługa wyjątku, to prościej po prostu sprawdzić przed operacją, przez co będzie wykonane dzielenia i zareagować, w przeciwnym wypadku:

    Kod: Java
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • Pomocny post
    #3 9428514
    enemyhilator
    Poziom 16  
    Posty: 183
    Pomógł: 14
    Ocena: 25
    Może coś w tym stylu
    
    try {
    //tutaj obliczenia powodujące dzielenie przez zero
        } catch (ArithmeticException e) { // 
          //tutaj informujesz użytkownika, że popełnił błąd np jOptionPanel.showMessageDialog
      }
    }
    


    Można też sprawdzać na bieżąco czy wpisał zero, jest też coś kiego jak klasa Validator, ale o tym to już google wie.
  • #4 9428542
    Fellert
    Poziom 10  
    Posty: 55
    Ocena: 3
    hmm a mógłbyś to zaimplementowac w kod który podałem bo próbowałem czegos podobnego ale jakoś mi nie wychodziło
  • #5 9428601
    przemo_wielki
    Poziom 24  
    Posty: 583
    Pomógł: 61
    Ocena: 10
    Napisałeś taki program i nie potrafisz wstawić 1 instrukcji którą masz podaną wyżej ?
  • REKLAMA
  • #6 9428612
    Fellert
    Poziom 10  
    Posty: 55
    Ocena: 3
    nie że nie umie próbowałem ale jakoś mi nie wychodzi a programu nie pisałem sam tylko razem z kolegą krok po kroku i dzięki pomocy wielu osób
  • Pomocny post
    #7 9428640
    enemyhilator
    Poziom 16  
    Posty: 183
    Pomógł: 14
    Ocena: 25
    Załóżmy, że interesuje cię ten fragment kodu
    Kod: Java
    Zaloguj się, aby zobaczyć kod


    po dodaniu "łapacza wyjątków" będzie wyglądał np. tak

    Kod: Java
    Zaloguj się, aby zobaczyć kod


    w przypadku reszty kodu sytuacja jest analogiczna. Dobre zwyczaje programisty karzą sprawdzać wszystkie pola którymi użytkownik wprowadza dane, to też mógł byś poprawić.
  • REKLAMA
  • #8 9428674
    Fellert
    Poziom 10  
    Posty: 55
    Ocena: 3
    ok zastąpiłem ten fragment kodu tym który mi podałeś tak wogóle wielkie dzięki
    tylko przy próbie kompilacji wywala mi błąd
    na:
    catch(ArithmeticException e){
    oraz
    JOptionPane.showMessageDialog("Błąd dzielenia przez 0");

    nie wiem czemu może mam nie zaimportowane jakieś biblioteki albo coś ??
  • Pomocny post
    #9 9428688
    enemyhilator
    Poziom 16  
    Posty: 183
    Pomógł: 14
    Ocena: 25
    Drobne poprawki. U mnie w eclipse działa bez błędu.
    Kod: Java
    Zaloguj się, aby zobaczyć kod
  • #10 9428716
    Fellert
    Poziom 10  
    Posty: 55
    Ocena: 3
    ok błędu już nie wywala dałem radę tylko teraz nowu wywala mi błąd na tym
    panel.add(Jlista);
                panel.add(tpole1);
                panel.add(tpole2);
                panel.add(tpole3);
                panel.add(tpole4);
                panel.add(pole1);
                panel.add(pole2);
                panel.add(pole3);
                panel.add(wpole1);
                panel.add(wpole2);
                panel.add(klik);
     
     
                okno.add(panel);
                okno.setVisible(true);


    ok spr to wrzucić do eclipse i dam znać czy trybi to]


    a własnie do javvy jakie środowisko jest najlepsze tak wogóle netbeans czy eclipse jest lepszy bo np na zajęciach my uzywamy jcreatora tak ogólnie ale to lipne jest wg mnie
  • Pomocny post
    #11 9428755
    enemyhilator
    Poziom 16  
    Posty: 183
    Pomógł: 14
    Ocena: 25
    U mnie cały twój kod ładnie działa. Ale brakuje kilku zabezpieczeń.
    Czy pola z danymi są puste, czy wpisane dane są cyfrą, czy wybrano typ figury, czy wpisana liczba jest dodatnia i w sensownym zakresie.
    Mi kiedyś za zalce profesorek który sprawdzał zadania, wpisał w pole tekstowe swoje imię i program się wysypał, stąd te sugestie co do zabezpieczania tego co użytkownik wprowadza.
    Ja osobiście używam eclipse, czasem gedit, ekstremalnie vim :D
    Ale jak chcesz ładnie GUI robić to NetBeance jest do tego idealny.
  • #12 9428778
    Fellert
    Poziom 10  
    Posty: 55
    Ocena: 3
    no tak co do tego to się zgodzę bo już obczaiłem sprawę menu itp jeżeli o to chodzi jest idealny nie wiem tylko nadal czemu mi nie działa to ale cóż spr sobie eclipse może wygodniejsze będzie do pisania takich aplikacji a netbeansa będę używać do okienkowych

    Hmm odnośnie tych zabezpieczeń jak to zdziałać bo u nas na przykład z c++ jak miałem zajęcie to robił coś innego wprowadzał liczbę ujemną chyba że w oknie była informacja żeby podać liczbę większa od zera wyłącznie wtedy się nie czepiał :D

    ale jak to zrobić te zabezpieczenia bo o tym akurat jeszcze się nie produkował znaczy tłumaczył

    mi akurat program się nie wysypuje jak wpisze literę spr ale jak wpisze liczbę ujemną to daje mi minusowa objętość :D
    jak to zabezpieczyć przed tym ??
  • #13 9428812
    azra
    Poziom 17  
    Posty: 108
    Pomógł: 26
    Ocena: 2
    Po prostu po wczytaniu danych sprawdź czy spełniają jakieś Twoje warunki - jeżeli nie, to poproś o nie usera jeszcze raz.
  • #14 9428860
    enemyhilator
    Poziom 16  
    Posty: 183
    Pomógł: 14
    Ocena: 25
    Sprawdź jak ci to działa. Zobacz co dodałem.

    Kod: Java
    Zaloguj się, aby zobaczyć kod
  • #15 9428862
    Fellert
    Poziom 10  
    Posty: 55
    Ocena: 3
    Malina działa jak trzeba teraz tylko muszę tekst pozmieniać sobie i będzie gites :D

    ech jednak java to nie przelewka

    a jeszcze coś da radę zmienić nazwę okienka które wywala po wystąpieniu błędu z message np na błąd ??
  • #16 9428871
    enemyhilator
    Poziom 16  
    Posty: 183
    Pomógł: 14
    Ocena: 25
    File->New
    Java Project
    Nazwa projektu
    Dwa Next, potem Finisz
    Potem File->New->Class
    Nazywasz ją main
    Wklejasz kod
    i gotowe

    Dodano po 5 [minuty]:

    Pewnie, że się da, można nawet typowe temu zdarzeniu ikony dodać
    Tutaj masz opis
    http://download.oracle.com/javase/1.4.2/docs/api/javax/swing/JOptionPane.html
    http://www.java2s.com/Tutorial/Java/0240__Swing/0960__JOptionPane-Dialog.htm
  • #17 9429154
    Fellert
    Poziom 10  
    Posty: 55
    Ocena: 3
    te dwa linki które dostałem sporo wyjasniają odnośnie kwestii message boxów itp dzięki wielkie pokombinuję co i jak w razie czego odezwe się jeszcze

Podsumowanie tematu

LABEL_AI_GENERATED
W dyskusji poruszono problem obsługi wyjątku dzielenia przez zero w języku Java. Użytkownik poszukiwał sposobu na dodanie komunikatu dla użytkownika w przypadku wprowadzenia wartości zero. Odpowiedzi sugerowały użycie bloku try-catch do przechwytywania wyjątku ArithmeticException oraz wyświetlanie komunikatu za pomocą JOptionPane. Użytkownicy podkreślali również znaczenie walidacji danych wejściowych, aby zapobiec wprowadzeniu wartości nieprawidłowych, takich jak liczby ujemne czy tekst. Wskazano na różne środowiska programistyczne, takie jak NetBeans i Eclipse, jako odpowiednie do pracy z Javą.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA