throw Exception

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • throw Exception

    Hallo Leute !
    Ich habe da ein paar Fragen zu throw Exception also das grundprinzip habe ich verstanden auch habe ich es schon mehrmal angewendet nur leider funzt es gerade nicht so wie ich möchte ;)

    Ich habe hier einen kleinen rechner mit AWT-Geschrieben sieht so aus

    Java-Quellcode

    1. package Rechner;
    2. import java.awt.*;
    3. import java.awt.event.*;
    4. public class Hauptfenster extends Frame {
    5. // Instanzvariable
    6. private Panel eingabePanel, operatorenPanel, ergebnisPanel;
    7. private TextField zahl1, zahl2;
    8. private Button plus, minus, div, multi;
    9. private Label ergebnis;
    10. //Konstruktor
    11. public Hauptfenster(){
    12. super("Rechner");
    13. //Layout für das Hauptfenster
    14. this.setLayout(new GridLayout(4,1));
    15. //Aufbau des eingabePanel
    16. eingabePanel=new Panel();
    17. eingabePanel.setLayout(new GridLayout(2,1,10,10));
    18. zahl1= new TextField("Zahl1");
    19. zahl2 = new TextField("Zahl2");
    20. eingabePanel.add(zahl1);
    21. eingabePanel.add(zahl2);
    22. // Aufbau des OperatorenPanels
    23. operatorenPanel= new Panel();
    24. operatorenPanel.setLayout(new FlowLayout());
    25. plus=new Button ("+");
    26. minus=new Button("-");
    27. div=new Button("/");
    28. multi=new Button("*");
    29. operatorenPanel.add(plus);
    30. operatorenPanel.add(minus);
    31. operatorenPanel.add(div);
    32. operatorenPanel.add(multi);
    33. //Evenets für die Knöpfe
    34. plus.addActionListener(new KnopfAktion());
    35. minus.addActionListener(new KnopfAktion());
    36. div.addActionListener(new KnopfAktion());
    37. multi.addActionListener(new KnopfAktion());
    38. //ergebnisPanel
    39. ergebnisPanel = new Panel();
    40. ergebnis =new Label("Bitte Wählen");
    41. ergebnisPanel.add(ergebnis);
    42. // einfügen in Container
    43. this.add(eingabePanel);
    44. this.add(operatorenPanel);
    45. this.add(ergebnisPanel);
    46. //Event-Handling fürs Fenster
    47. this.addWindowListener(new WindowAdapter(){
    48. public void windowClosing(WindowEvent w){
    49. System.exit(0);
    50. }
    51. });
    52. }
    53. class KnopfAktion implements ActionListener{
    54. public void actionPerformed(ActionEvent e){
    55. berechnen (e);
    56. }
    57. }
    58. private void berechnen(ActionEvent e){
    59. //ergebniss
    60. double erg=0.0d;
    61. // Umwandlung Zahl1 und Zahl2
    62. // benötigt wrapperKlassen
    63. // von innen nach außen arbeiten!
    64. double z1= Double.parseDouble(zahl1.getText()) ;
    65. double z2= Double.parseDouble(zahl2.getText());
    66. //entscheiden welcher Knopf gedrückt
    67. // und berechnen
    68. //addition
    69. if(e.getActionCommand()==plus.getLabel()){
    70. erg=z1+z2;
    71. }
    72. //subtraktion
    73. if(e.getActionCommand()==minus.getLabel()){
    74. erg=z1-z2;
    75. }
    76. // mulitplikation
    77. if(e.getActionCommand()==multi.getLabel()){
    78. erg=z1*z2;
    79. }
    80. if(e.getActionCommand()==div.getLabel()){
    81. erg=z1/z2;
    82. }
    83. //Ausgabe
    84. //Wieder WrapperKlassen benötigt da erg kein String ist
    85. // Achtung wieder von innen nach außen arbeiten !
    86. ergebnis.setText( String.valueOf(erg) );
    87. }
    88. }
    Alles anzeigen



    So der kann +- * / funktioniert auch super...... Jetzt könnte es aber sein das anstelle einer zahl ein buchstabe eingegeben wird nun bekommen wir ja eine NumberFormatException diese möchte ich auffagen
    dashalb habe ich folgendes gemacht :

    Quellcode

    1. try{
    2. double z1= Double.parseDouble(zahl1.getText()) ;
    3. double z2= Double.parseDouble(zahl2.getText());
    4. }catch(NumberFormatException f){
    5. System.out.println("Bitte geben Sie eine Zahl ein!");
    6. }

    so nun passiert folgendes die funktion berechne (e) kann nun die z1 und z2 nicht mehr resolven .....
    und die Console sagt :Exception in thread "AWT-EventQueue-0" java.lang.Error: Unresolved compilation problems:

    nun habe ich mir gedacht ich fange vieleicht die Exception an der falschen stelle ab habe nun folgendes gemacht :

    Quellcode

    1. try{
    2. zahl1= new TextField("Zahl1");
    3. zahl2 = new TextField("Zahl2");
    4. }catch(NumberFormatException f){
    5. System.out.println("Bitte geben Sie eine Zahl ein ");
    6. }

    Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "g"

    so ist ja eigentlich klar weil das kann ja gar nicht die richtige stelle sein da ich ja hier einen String eingeben will bzw muss so
    nun denk ich mal war ich am anfang schon richtig bei :

    Quellcode

    1. double z1= Double.parseDouble(zahl1.getText()) ;
    2. double z2= Double.parseDouble(zahl2.getText());

    aber warum kann er jetzt z1 und z2 nicht mehr resolven ?????
    oder bin ich doch an der falschen stelle ? ???

    habe auch schon daran gedacht z1 und z2 außerhalb des try / catch blockes zu deklariern

    Quellcode

    1. private void berechnen(ActionEvent e){
    2. //ergebniss
    3. double z1;
    4. double z2;
    5. double erg=0.0d;
    6. // Umwandlung Zahl1 und Zahl2
    7. // benötigt wrapperKlassen
    8. // von innen nach außen arbeiten!
    9. try{
    10. z1= Double.parseDouble(zahl1.getText()) ;
    11. z2= Double.parseDouble(zahl2.getText());
    12. }catch (NumberFormatException f){
    13. System.out.println("Bitte geben Sie eine Zahl ein ");
    14. }
    Alles anzeigen


    nun sagt die Console folgendes dazu:

    Exception in thread "AWT-EventQueue-0" java.lang.Error: Unresolved compilation problems:
    The local variable z1 may not have been initialized
    The local variable z2 may not have been initialized
    The local variable z1 may not have been initialized
    The local variable z2 may not have been initialized
    The local variable z1 may not have been initialized

    also ist jetzt plötzlich nicht mehr initialisiert vorher war sie nicht mehr resolved

    Wie kann ich nun die Exception abfangen bzw wo entsteht diese überhaupt ?????

    Viele Grüße

    the_old_pirate
  • Also..

    zum resolved Problem: Du deklarierst z1 und z2 innerhalb des Try-Blocks. Außerhalb sind sie natürlich _nicht_ mehr bekannt.

    Zum Initialiserungsproblem: Wenn du Variablen innerhalb einer Operation deklarierst musst du ihnen IMMER einen Initialwert geben. Zum Beispiel 0.0 oder sowas.

    Zur Exception: NumberFormatException ist eine unchecked Exception. In Java gibt es zwei Arten von Exceptions: checked und unchecked.
    Wenn eine Operation eine checked Exception wirft wirst du gezwugen diese zu behandeln (try/catch oder throw). Bei unchecked ist das anders.. hier geht man eher vom optimismus aus "wird schon" ;)
    Es wäre auch äußerst lästig wenn du jede unchecked Exception fangen/werfen müsstest...


    Achso zu der Frage "wo entsteht die Exception" bitte ich dich nochmal drüber nach zu denken ;) Wo kann er denn überhaupt merken das der Wert eine Zahl sein muss diese es aber ggf nicht ist!?

    Viele Grüße :)
  • Danke Fokus trotzdem ein paar Fragen;)

    Hallo Fokus danke für deine Antwort .... Ja du hast recht an das initialisierungs problem hätte ich denken müssen *seblst mal auf den hinterkopf hau!*

    nun ja natürlich kann er nur bei der Umwandlung mit den Wrapper Klassen merken ahhh mom da stimmt was nicht .... sorry dumme Frage!

    Das mit den checked und unchecked wusste ich noch nicht danke sehr kannst du mir trotzdem noch mal den unterschied erklären ?

    auch wenn das eine unchecked Exeption ist möchte ich sie trotzdem gerne fangen um etwas zu üben und mich mit dem Thema zu befassen habe nun folgendes gemacht :

    Quellcode

    1. private void berechnen(ActionEvent e){
    2. double z1=0.0;
    3. double z2=0.0;
    4. fehler = new Label("Bitte Geben Sie eine Zahl ein ");
    5. //ergebniss
    6. double erg=0.0d;
    7. // Umwandlung Zahl1 und Zahl2
    8. // benötigt wrapperKlassen
    9. // von innen nach außen arbeiten!
    10. try{
    11. z1= Double.parseDouble(zahl1.getText()) ;
    12. z2= Double.parseDouble(zahl2.getText());
    13. } catch(NumberFormatException f){
    14. ergebnisPanel.add(fehler);
    15. z1=0.0;
    16. z2=0.0;
    17. }
    Alles anzeigen


    kann man hoffentlich unten im angehängten bild erkennen er gibt mir eine Fehlermeldung in dem ergebnissPanel aus genau wie ich es haben möchte .... Jedoch erst nach dem ich das Fenster groß gezogen habe warum ?

    so nun möchte ich aber das wenn ich eine Zahl eingegeben habe also meinen Fehler korriegiert habe ein ergebins ausgibt tut er ja auch nur leider auch mit Fehlermeldung habe nun folgendes versucht :

    Quellcode

    1. //Ausgabe
    2. //Wieder WrapperKlassen benötigt da erg kein String ist
    3. // Achtung wieder von innen nach außen arbeiten !
    4. if (erg>0 & ergebnisPanel.isAncestorOf(fehler)){
    5. ergebnisPanel.remove(fehler);
    6. }
    7. ergebnis.setText( String.valueOf(erg) );
    Alles anzeigen


    das funzt nur so halb wenn ich einen Fehler verursache dann kommt natürlich die fehlermeldung aber wenn ich diesen dann korriegiere passiert trotzdem nichts aber eigentlich sollte er doch in die if Abfrage laufen

    und sehn ahhh erg>0 und eingabePanle.is Ancesterof(fehler)
    also muss ich jetzt das Label fehler entfernen tut er aber nicht warum ????


    also hab ich mir folgendes gedacht ich mach eine do while schleife und lass die Fehlermeldung so oft ausführen bis z1 >0 && z2 >0
    so wenn die do while dann durchlaufen ist sollte er irgenwann unten in die If abfrage laufen und fehler removen !!!
    bllöder weiße funzt das auch nicht!!!

    Brainfuck-Quellcode

    1. try{
    2. z1= Double.parseDouble(zahl1.getText()) ;
    3. z2= Double.parseDouble(zahl2.getText());
    4. } catch(NumberFormatException f){
    5. do{
    6. ergebnisPanel.add(fehler);
    7. z1=0.0;
    8. z2=0.0;
    9. }while(z1>0 && z2>0);
    10. }
    11. ............................................
    12. if (erg>0 & ergebnisPanel.isAncestorOf(fehler)){
    13. ergebnisPanel.remove(fehler);
    14. }
    Alles anzeigen


    so nun was mach ich jetzt ? hoffe es kann mir jemand helfen !

    ahhh noch eine kleine Frage am rande ich besitze ein Nokia 5230 und das unterstütz Java gibt es eine möglichkeit den Rechner wenn er denn mal Fertig ist als stand Alone also als exe zu machen und ihn in irgend einer weiße auf das Handy zu installieren bzw dort auszuführen müsste doch gehn oder immerhin ist es ja Java fähig und kann auch andere java programme benutzen !!!

    Danke schon mal im Vorraus

    Viele Grüße

    the_old_pirate
    Bilder
    • AWT_Rechner.png

      188,41 kB, 2.699×1.308, 314 mal angesehen
  • Puh wieder viel Text :D

    Achso eins vorweg. Es ist super das du deinen Code in den jeweiligen Highligh-Container packst aber noch besser wäre es wenn du "Java" auswählst :) Dann hätten wir hier auch schickes syntax highlighting und so ;)

    Tjoah zu den checked & unchecked lässt sich gar nicht mehr sooo furchtbar viel sagen...
    Eine checked Exception erbt von der Klasse Exception. Eine unchecked erbt von RuntimeException (welche auch von Exception erbt)... allein die Namensgebung erklärt schon das Vorgehen vieler Leutchens.
    Checked Exceptions werden gerne für "fachliche" Ausnahmen verwendet wohingegen unchecked Exceptions ab und an für technische Ausnahmen verwendet werden.
    Ich benutze recht selten unchecked exceptions aber wie gesagt, das ist ansichtssache. Um dein Umgang mit dem Exceptionhandling etwas zu trainieren würde ich dir empfehlen erstmal bei den checked exceptions zu bleiben :)

    So dann zu dem Anzeigeproblem:
    Wenn du ein neues Element an eine Oberfläche bringst solltest du diesem auch die möglichkeit geben sich zu "erfrischen" bzw. die Elemente neu zu "malen".
    Das neu malen passiert zum Beispiel durch ändern der Fenstergröße oder eben durch einen einfachen Aufruf der "repaint()"-Methode im JFrame.

    Ich würde an deiner Stelle folgendes machen:
    Das Label was du hinzufügst wenn eine Exception auftritt packst du einfach in der Initialisierung mit rein (nur ohne Text).
    Wenn ein Fehler auftritt setzt du ein Text (label.setText("blabla"); )

    Wenn du das Ergebnis ausgibst, kannst du davon ausgehen das alles gut gegangen ist ;) Also label.setText(""); sprich den Text wieder entfernen.
    Feddich. Kein repaint und eben auch kein Ärger mit "veralteten" Oberflächen (guckst ja irgendwie in die Vergangenheit wenn du was entfernt hast und es noch zu sehen ist oO) ;)

    Hoffe das hilft :)
  • Danke Fokus!

    Also hab das jetzt so gemacht wie du mir vorgesclagen hast funktioniert wunderbar!!! bin da nur noch auf nen kleinen Logik Fehler gestoßen

    Quellcode

    1. if (erg>0 ){
    2. fehler.setText(" ");
    3. }


    so jetzt kanns natürlich aber auch passieren das das ergebnis null ist womit ja die fehler Meldung immer noch da wäre also hab ich folgendes gemacht

    Quellcode

    1. if (z1>0 || z2>0 || z1>0 && z2>0 ){
    2. fehler.setText(" ");
    3. }


    so nun funzt alles wunderbar also habs getestet und kein fehler mehr endeckt wenn jemand noch was endeckt kann er sich gerne melden bin dankbar für jede Konstruktive Kretik ;)

    sorry das ich immer so viel Text schreibe aber versuche mein Problem eben so genau wie möglich zu erklären und schritt für schritt aufzuzeigen was ich gemacht hab :)

    Danke nochmals

    Viele grüße

    ach ja bevor ichs vergesse weiß noch jemand irgenwas zu meiner frage mit dem Handy würde mich echt mal interessieren muss ja irgenwie gehen oder ? also gehackt ises schon müsste nur noch nen weg finden mein prog aufn handy zu bekommen und dort auszuführen
  • Kann das Ergebnis denn wirklich "null" sein? Oder nur 0 ?
    0 Wäre ja kein Problem, solltest du anzeigen das es eben 0 ist.. ist ja kein Fehler :)

    Mhh welches Betriebssystem hat dein Handy denn?
    Achso und Java Dateien kommen in aller Regel nicht in .exe Dateien sondern in .jar.
    .exe ist ja Windowsspezifisch und Java ist eben eine Plattformunabhängige Sprache.
    Es ist zwar durchaus möglich da eine .exe draus zu machen aber recht unüblich.

    Wenn du forderst das weitere Parameter beim Aufruf deines Programms mitgegeben werden müssen dann musst du den Aufruf natürlich irgendwie Kapseln.
    Beispielsweise in eine .bat (eher Windows) oder .sh (eher Unix)...
    Idealerweise läuft dein Programm aber auch ohne Parameter bzw. die Parameter sind eben optional. Dann kann der Benutzer das selber entscheiden wie er das handhaben will.
  • ja also mein Handy ist nen Nokia 5230 mit Symbian S60V5 mit der Softwareversion (weiß nicht ob die nötig ist) V11.0.079 also schon ältere firmware und wurde bereits gehackt....
    mich würde vorallem interessieren da das handy ja einen touchscreen hat müsste ich ja die ganzen listener so einrichten das sie für den touchscreen funzen oder nicht ?

    ahh ok habe noch nie so ne .bat datei geschrieben oder was von gehört bzw mich damit befasst werde mal im internet mich darüber schlau machen wenn jemand nen guten link kennt wo das genauer erklärt wird kann ihn ja vieleicht posten danke ;)