You are not logged in.

Dear visitor, welcome to Coder Forum. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

1

Tuesday, September 7th 2010, 8:04pm

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

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
package Rechner;


import java.awt.*;
import java.awt.event.*;

public class Hauptfenster extends Frame {
	
	// Instanzvariable 
	private Panel eingabePanel, operatorenPanel, ergebnisPanel;
	private TextField zahl1, zahl2;
	private Button plus, minus, div, multi;
	private Label ergebnis;
	
	
	//Konstruktor
	public Hauptfenster(){
		
		super("Rechner");
		
		//Layout für das Hauptfenster
		
		this.setLayout(new GridLayout(4,1));
		
		//Aufbau des eingabePanel
		
		eingabePanel=new Panel();
		eingabePanel.setLayout(new GridLayout(2,1,10,10));
		
		zahl1= new TextField("Zahl1");
		zahl2 = new TextField("Zahl2");
		
		eingabePanel.add(zahl1);
		eingabePanel.add(zahl2);
		
		// Aufbau des OperatorenPanels
		
		operatorenPanel= new Panel();
		
		operatorenPanel.setLayout(new FlowLayout());
		
		plus=new Button ("+");
		minus=new Button("-");
		div=new Button("/");
		multi=new Button("*");
		
		operatorenPanel.add(plus);
		operatorenPanel.add(minus);
		operatorenPanel.add(div);
		operatorenPanel.add(multi);
		
		
		//Evenets für die Knöpfe 
		
		plus.addActionListener(new KnopfAktion());
		minus.addActionListener(new KnopfAktion());
		div.addActionListener(new KnopfAktion());
		multi.addActionListener(new KnopfAktion());
		
		
		
		
		
		//ergebnisPanel
		
		ergebnisPanel  = new Panel();
		
		ergebnis =new Label("Bitte Wählen");
		
		ergebnisPanel.add(ergebnis);
		
		// einfügen in Container 
		this.add(eingabePanel);
		this.add(operatorenPanel);
		this.add(ergebnisPanel);
		
		//Event-Handling fürs Fenster
		
		this.addWindowListener(new WindowAdapter(){
			
			public void windowClosing(WindowEvent w){
				
				System.exit(0);
			}
		});
		
		
	}
	class KnopfAktion implements ActionListener{
		
		public void actionPerformed(ActionEvent e){
			
			berechnen (e);
		}
		
		
	}
		
	private void berechnen(ActionEvent e){
		
		//ergebniss
		
		double erg=0.0d;
		
		// Umwandlung Zahl1 und Zahl2
		// benötigt wrapperKlassen
	   // von innen nach außen arbeiten!
	
	
		
		double z1=  Double.parseDouble(zahl1.getText()) ;             
		double z2=	Double.parseDouble(zahl2.getText());		
	
			
		
		//entscheiden welcher Knopf gedrückt 
		// und berechnen
		
		//addition
		if(e.getActionCommand()==plus.getLabel()){
			
			erg=z1+z2;
			
		}
		
		//subtraktion
		
		if(e.getActionCommand()==minus.getLabel()){
			
			erg=z1-z2;
			
		}
		
		
		// mulitplikation
		
		if(e.getActionCommand()==multi.getLabel()){
			
			erg=z1*z2;
		}
		
		if(e.getActionCommand()==div.getLabel()){
			
			erg=z1/z2;
			
		}
		
		//Ausgabe
		//Wieder WrapperKlassen benötigt da erg kein String ist 
		// Achtung wieder von innen nach außen arbeiten !
		
		       ergebnis.setText( String.valueOf(erg)  );            
		
	}
	
}



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 :

Source code

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

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 :

Source code

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

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 :

Source code

1
2
double z1=  Double.parseDouble(zahl1.getText()) ;             
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

Source code

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


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

2

Wednesday, September 8th 2010, 3:45pm

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 :)

3

Thursday, September 9th 2010, 2:36pm

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 :

Source code

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

		}


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 :

Source code

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


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!!!

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
try{
		
		 z1=  Double.parseDouble(zahl1.getText()) ;             
		 z2=	Double.parseDouble(zahl2.getText());		
		} catch(NumberFormatException f){
			
			do{
			ergebnisPanel.add(fehler);
			
			z1=0.0;
			z2=0.0;
			}while(z1>0 && z2>0);

		}
		............................................
	if (erg>0 & ergebnisPanel.isAncestorOf(fehler)){
		
			
			
			ergebnisPanel.remove(fehler);
			
			
		}


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
the_old_Pirate has attached the following image:
  • AWT_Rechner.png

4

Thursday, September 9th 2010, 7:25pm

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 :)

5

Friday, September 10th 2010, 2:06pm

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

Java Quellcode

1
2
3
4
5
6
7
8
if (erg>0 ){
 
 
			fehler.setText(" ");
 
 
 
		}


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

Java Quellcode

1
2
3
4
5
6
7
8
if (z1>0 || z2>0 || z1>0 && z2>0 ){
 
 
			fehler.setText(" ");
 
 
 
		}


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

6

Friday, September 10th 2010, 4:41pm

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.

7

Sunday, September 12th 2010, 2:37pm

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 ;)

Similar threads

Social bookmarks