Try-Catch-Frage

  • Themenstarter Themenstarter Java-Erstanwender
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
J

Java-Erstanwender

Gast
Hi,
bin neu in der Java-Insel. Komme von c/c++ und VB.NET/6...das zu meinen Grundkentnissen 😉

Nun soll ich etwas in Java programmieren, und versuche mich grad an verschieden Sachen, aber nun zu meiner Frage:

Wofür kann ich try-catch alles benutzen?

Ich habe mir eine kleine Klasse "meinDatum" gebastelt. Bei der Methode "setzeDatum" wollte ich einige try-catch'es' einfügen:

Code:
public class MeinDatum {

	private int tag;
	private int monat;
	private int jahr;
	
	public void setzeDatum(int t, int m , int j) {
		try{
			tag=t;
		}
		catch([b]##############[/b]){
		System.out.println("Fehler");	
		}
		monat=m;
		jahr=j;
		}
	public String ausgabe(){return(tag + "." + monat + "." + jahr);}
}

dort wo ich die Rauten (#) im catch gesetzt habe, wollte ich eigentlich abfangen, das der Tag nur zw. 1und 31 seien darf.

ich weiß, das ist keine wirkliche Datumsprüfung, aber mir gehts nur ums Prinzip, ob ich try-catch evtl son bisschen wie if-else nehmen kann, um Fehler abzufangen, doch ich lese immer nur von irgendwelchen Exceptions etc...

also nochmal, es dient alles nur dazu, damit ich ein bisschen lerne, um später damit gut umgehen zu können, deswegen freue ich mich über jeden Tipp, der mich evtl weiterbringt!

MfG
Java-Erstanwender
 
Ein try - catch Block dient eigentlich eher dazu eine auftretende Exception zu erkennen und zu behandeln. In diesem Fall müsstest du prüfen, ob der Tag <= 31 oder >=1 ist, und wenn nicht eine Exception (hier eine IOException) erstellen:

Code:
if((tag<1)||(tag>31)) {
  throw new IOException("tag muss einen Wert von 1-31 haben")
}

Bei der Methode solltest du nun noch kenntlich machen, dass diese eine Exception verursachen kann:

Code:
public void setzeDatum(int t, int m , int j) throws IOException

Beim Aufruf dieser Methode kommt nun der try-catch Block zum Einsatz:

Code:
try{
  setzeDatum(t, m, j);
}
catch(IOException e) {
  // Fehlerbehandlung
  System.err.println(e.getMessage());
}

Ist nur eine Möglichkeit des Exceptionhandling, aber meiner Meinung nach eine recht übersichtliche.

mfg DeeP
 
als Nachtrag noch erwähnt, dass in diesem Falle eine IOExcpetion nicht sehr gut ist... Aufgrund der Logik wäre eine IllegalArgumentExcpetion sinnvoller !
 
Anonymous hat gesagt.:
danke, aber wo kommt das erste if hin, welches du gepostet hast?
ich würds gleich am anfange der methode setzen
Code:
public void setzeDatum(int t, int m , int j) { 
      if(t < 1 || t > 31) {
            throw new IllegalArgumentExeption("Falscher Tag !"),
      }
      if(m < 1 || m > 12) {
           throw new IllegalArguementException("Falscher Monat !"),
      }
      tag = t
      monat=m; 
      jahr=j; 
      }
 
deathbyaclown hat gesagt.:
Anonymous hat gesagt.:
danke, aber wo kommt das erste if hin, welches du gepostet hast?
ich würds gleich am anfange der methode setzen
Code:
public void setzeDatum(int t, int m , int j) { 
      if(t < 1 || t > 31) {
            throw new IllegalArgumentExeption("Falscher Tag !"),
      }
      if(m < 1 || m > 12) {
           throw new IllegalArguementException("Falscher Monat !"),
      }
      tag = t
      monat=m; 
      jahr=j; 
      }

IllegalArguementException kentzeichnet er rot:

...cannot be resolved to a type


das sagt er auch, wenn ich IOException nehme..

hier mal die main(ein teil):

Code:
setzeDatum.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
			public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
				MeinDatum Meins = new MeinDatum();
				try {
					try {
					Meins.setzeDatum(Integer.parseInt(tag.getText()),Integer.parseInt(monat.getText()),Integer.parseInt(jahr.getText()));
					}
					catch(IOException e){  //hier sagt er acuh "rotkreuz"->cannot be resolved to a type
						System.err.println(e); 
					}
					lb_DatumAusgabe.setText(Meins.ausgabe());
					System.out.println("widgetSelected()"); // TODO Auto-generated Event stub widgetSelected()}
				}
				catch(NumberFormatException p) {
					System.out.println("Keine Zahlen eingegeben!Bitte noch einmal probieren");
				}
		
			}
		});
 
so wie sich das anhört musste die Exceptions noch beim Import erwähnen! :!: das sind auch Klassen die eingebunden werden wollen :meld: .

Also einfach dahinter fehen und dann Strg+Leertaste drücken rest macht Eclipse fleissig wie es ist selbst!
 
dankeschön, klappt nun, auch wenn ich es nicht ganz kapiere 😉

hier nochmal so wie es jetzt ist:

Code:
public class MeinDatum {

	private int tag;
	private int monat;
	private int jahr;
	
	public void setzeDatum(int t, int m , int j) throws IllegalArgumentException{ 
	      if(t < 1 || t > 31) { 
	            throw new IllegalArgumentException("Falscher Tag !"); 
	      } 
	      if(m < 1 || m > 12) { 
	           throw new IllegalArgumentException("Falscher Monat !"); 
	      } 
	      tag = t; 
	      monat=m; 
	      jahr=j; 
	      }
	public String ausgabe(){return(tag + "." + monat + "." + jahr);}
}

----------------------------------------------

Code:
setzeDatum.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
			public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
				MeinDatum Meins = new MeinDatum();
				try {
					try {
						Meins.setzeDatum(Integer.parseInt(tag.getText()),Integer.parseInt(monat.getText()),Integer.parseInt(jahr.getText()));
						lb_DatumAusgabe.setText(Meins.ausgabe());
					}
					catch(Exception w){
						lb_DatumAusgabe.setText("");
						System.out.println(w);
					}
				}
				catch(NumberFormatException p) {
					System.out.println("Keine Zahlen eingegeben!Bitte noch einmal probieren");
				}
		
			}
		});

was mich nun noch wundert, ist dass ich keine void main (string[]) irgendwas benötige,habe nur:

private void createMainForm() {[...ales drin...]}

..habe eine shell aus der swt-libary...aber es funktioniert

wobei er sagt:the method createMainForm() from the type Start is never uesed locally! (geld unterstrichen)
 
setzt er bei meiner datumsklasse nicht trotzdem den tag und den monat? oder springt er im "Illegal-fall" aus dem 'setter'?
 
Er springt an dem Punkt wo der Fehler auftritt wenn Tag also geht dann macht er das wenn Monat dann nicht geht ist Tag aber gesetzt also im catch sollte dafür dann evtl ein Reset sen falls das Programm damit nicht total abbrechen soll.... was ich mal nicht denke!

Und was war mit dem import hattest da was nicht verstanden? Was denn nicht?
 
TRunKX hat gesagt.:
Er springt an dem Punkt wo der Fehler auftritt wenn Tag also geht dann macht er das wenn Monat dann nicht geht ist Tag aber gesetzt also im catch sollte dafür dann evtl ein Reset sen falls das Programm damit nicht total abbrechen soll.... was ich mal nicht denke!

Und was war mit dem import hattest da was nicht verstanden? Was denn nicht?

und wie mach ich so einen reset :?:

das mit dem import klappte, was ich nicht genau verstanden habe, sind halt die exeptions an sich so, also ob es an dieser stelle zb. sinnvoll ist etc...hier zb:

Code:
try { 
                  Meins.setzeDatum(Integer.parseInt(tag.getText()),Integer.parseInt(monat.getText()),Integer.parseInt(jahr.getText())); 
                  lb_DatumAusgabe.setText(Meins.ausgabe()); 
               } 
               catch(Exception w){ 
                  lb_DatumAusgabe.setText(""); 
                  System.out.println(w); 
               }
aber naja, es klappt ja
 
System.out.println(w); im catch-Block ist nich passend.

entweder:

System.out.println(w.getMessage()); //für einbisschen information reicht, weil die exception vernünftig behandelt wurde

oder

w.printStackTrace(); //hier spuckts mit alle einzellheiten
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben