Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

01.11.2011, 15:24

Java - ExceptionHandling

Hallo zusammen.

Ich hätte mal eine Frage zu try{}catch(...){} in Java.

Gewisse Dinge verlangen ja ein ExceptionHandling, vor allem wenn es um Dateizugriff geht.
Wenn dann mit den ausgelesenen Daten aus der Datei etwas passieren soll, macht ihr das dann auch noch im try-Block, evtl. sogar mit
lokalen Variablen oder setzt ihr die Variablen VOR den try-Block, schreibt nur den Dateizugriff und das Datenauslesen in den try-Block und macht
dann nach dem catch-Block weiter evtl. mit Daten aus Datei arbeiten?
„lean over the bowl and then take a dive all of you are dead. i am alive“

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

01.11.2011, 15:41

Hängt davon ab, aber ich denk normalerweise im try-Block.

3

01.11.2011, 16:31

(edit: hatte dots beitrag noch nicht gelesen)
Wenn du mit Java 7 arbeitest empfiehlt sich try with resources. Wie du dann weiter vorgehst kommt ein bisschen auf die Dinge an, die du mit den Daten machen willst. Normalerweise packe ich alle Dateizugriffe in den Block und sehe zu, dass keine Programmänderungen vorgenommen werden solange der Block nicht abgearbeitet ist. Meistens pack ich solche Sachen in Funktionen und gebe dann entweder null oder eben die geladenen Daten zurück.

BLU3 L30PARD

Treue Seele

Beiträge: 336

Wohnort: Hoch oben im Norden Schleswig Holsteins

Beruf: Schüler

  • Private Nachricht senden

4

01.11.2011, 16:34

Zitat aus dem Galileo Openbook:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Reader reader = null;
try
{
  reader = new FileReader( "bin/lyrics.txt" );

  for ( int c; ( c = reader.read() ) != –1; )
    System.out.print( (char) c );
}
catch ( IOException e ) {
  System.err.println( "Fehler beim Lesen der Datei!" );
}
finally {
  try { reader.close(); } catch ( Exception e ) { }
}

;)

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

5

01.11.2011, 16:58

die daten werden da lediglich ausgelesen und danach werden sie nicht weiter verarbeitet

du solltest das in der regel trennen, beispielsweise indem du den “unsicheren“ code in eine separate methode auslagerst und dir die ausgelesenen daten zurückgeben lässt
in manchen fällen kann es sich lohnen, die verarbeitung und das auslesen zu kombinieren, allerdings ist das nicht die regel
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

6

01.11.2011, 17:05

Bei folgendem Code bin ich mir z.B. nicht sicher ob ich alles im try-Block lassen soll und wenn ja, ob ich da die Variablen dazu auch reinnehmen soll
aber dann sind die eben nur lokal gültig. Ebenfalls hab ich hier nur 1 Exception und falls das Prog irgendwo abstürzt gibt es mir zwar 1 ExceptionCode aus
aber sollte man nicht jede Fehlerquelle separat per ExceptionHandling abfangen und dann eine "sprechende" Fehlermeldung erzeugen?

C#-Quelltext

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
package lesen;

import java.io.*;
import java.util.*;

public class AP02 {

    /**
    * @param args
    */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
         
        double [][] preise = new double[][]{{0.35,1.09,0.45},{0.42,1.23,0.62},{0.46,1.34,0.87},{0.49,1.46,0.91}};
        Date a = new Date();
        Date b = new Date();
        double diff=0;
        int anzahl=0;
        int jahr=0;
        int monat=0;
        int tag=0;
        int stunde=0;
        int minute=0;
        int sekunde=0;
        double gesamt=0;
        int x = -1;
        int y = -1;
        

        try{
            StreamTokenizer eingabe = new StreamTokenizer(System.in);
            System.out.println("Dateiname eingeben:");
            eingabe.nextToken();
            String s1 = eingabe.sval;

            String pfad = "C:\\Users\\Wolfgang\\workspace\\Dateizugriff\\bin\\lesen\\"+s1;

            FileReader datei = new FileReader(pfad);

            eingabe = new StreamTokenizer(datei);

            eingabe.nextToken();
            while(eingabe.ttype != StreamTokenizer.TT_EOF){
                if(eingabe.ttype == StreamTokenizer.TT_NUMBER){

                    int wert = (int)eingabe.nval;

                    String text = String.valueOf(wert);

                    if(text.length()==8){

                        jahr = Integer.parseInt(text.substring(0,4));
                        monat = Integer.parseInt(text.substring(4,6));
                        tag = Integer.parseInt(text.substring(6,8));

                        //System.out.println("jahr:"+jahr);
                        //System.out.println("monat:"+monat);
                        //System.out.println("tag:"+tag);

                    }

                    if(text.length()==6){

                        stunde = Integer.parseInt(text.substring(0,2));
                        minute = Integer.parseInt(text.substring(2,4));
                        sekunde = Integer.parseInt(text.substring(4,6));

                        //System.out.println("stunde:"+stunde);
                        //System.out.println("minute:"+minute);
                        //System.out.println("sekunde:"+sekunde);

                    }

                    anzahl++;

                    if(anzahl == 2){
                        a = new Date(jahr-1900,monat-1,tag,stunde,minute,sekunde);
                        //System.out.println(a);
                    }
                    if(anzahl == 4){
                        b = new Date(jahr-1900,monat-1,tag,stunde,minute,sekunde);
                    }

                }else{
                    String text = eingabe.sval;

                    //System.out.println("rechner:"+text);
                                        
                    if(a.getHours() > 0){
                         y = 0;
                    }
                    if(a.getHours() > 6){
                         y = 1;
                    }
                    if(a.getHours() > 18){
                         y = 2;
                    }
                    
                    if(text.equals("A")){
                         x = 0;
                    }else if(text.equals("B")){
                         x = 1;
                    }else if(text.equals("C")){
                         x = 2;
                    }else if(text.equals("D")){
                         x = 3;
                    }
                    //System.out.println("x:"+x+" / y:"+y);
                    diff = b.getTime() - a.getTime();
                    diff = diff / 1000;
                    //System.out.println("diff:"+diff);
                    //System.out.println("preis:"+preise[x][y]);
                    gesamt += ( diff * preise[x][y]);

                    //System.out.println(diff+" Sekunden an Rechnertyp "+text);

                    anzahl = 0;
                }

                eingabe.nextToken();
            }


        }catch(Exception e){
            System.out.println("Fehler: "+e);
        }

        System.out.printf("Die Kosten betragen %.2f €",gesamt);
    }

}
„lean over the bowl and then take a dive all of you are dead. i am alive“

7

01.11.2011, 17:36

Die Ausgabe am Ende sollte wenn auch in den Catch-Block, sonst könnte man aus Versehen das Ergebnis für ein fehlerfreies halten. Du schließt die Streams/Reader nicht. Zeilen 50-70 sollten der Übersicht halber vielleicht in eine Funktion und direkt ein Date ausgeben.
Ich gehe mal davon aus, dass das Format für die Dateien festgelegt ist. Daher wäre es vielleicht einfacher und gleichzeitig "sensibler" bezüglich der Daten, wenn du die benötigten Parameter pro Datensatz in einer Datensatz-Klasse einliest ohne unerkannte Werte zu tolerieren und am Ende nur die entsprechenden Daten aus der Klasse holst. Dein Programm sollte momentan nämlich bei falschen Werten ziemlich merkwürdige Dinge ausspucken. Zum Beispiel wenn einfach so Text in der Datei vorkommt wird für den Datensatz die letzte Preisklasse genommen etc. ist das so gewollt? Ansonsten ginge natürlich statt Datensatz-Klasse auch einfach ein direktes Abfragen.
Also so vielleicht (readDate liest Datum aus eingabe und gibt null zurück wenn dabei ein Fehler auftritt (z.B. falscher Token)):
while(true){
Date a=readDate(eingabe);
if(a==null)
break;
Date b=readDate(eingabe);
if(b==null)
throw new Exception("Datum erwartet in Zeile "+eingabe.lineno());
eingabe.nextToken();
String text = eingabe.sval;
//..
}

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Chromanoid« (02.11.2011, 14:08)


8

02.11.2011, 12:24

Stimmt, die Ausgabe pack ich ans Ende vom Try-Block sonst kommt das auch bei nem Fehler und datei.close() hab ich vergessen.
Die Aufgabe war nur die Berechnung, Datei war gegeben und hat einen bestimmten Aufbau, deshalb brauch ich die Datei nicht prüfen.
Aufbau:
20020424 134556 20020424 162538 C
20020424 202100 20020424 230000 D

Sollten die Variablen dann auch besser in den try-Block rein?
„lean over the bowl and then take a dive all of you are dead. i am alive“

9

02.11.2011, 13:54

Ist eigentlich egal wohin du die Variablen packst, aber ich würde sie möglichst so platzieren, dass sie den kleinst möglichen Scope haben - das finde ich am elegantesten und sichersten. Wenn der Aufbau fest ist, dann würde ich gar nichts mit anzahl und Zustandswechsel über mehrere Schleifendruchläufe machen. Schließlich ist der Code dann viel kompakter und eleganter (siehe meine Schleife oben).
readDate würde dann so aussehen:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private Date readDate(StreamTokenizer eingabe) throws Exception {
 eingabe.nextToken();
 if(eingabe.ttype == StreamTokenizer.TT_EOF)
  return null;
 String text = String.valueOf((int)eingabe.nval);
 eingabe.nextToken();
 text += String.valueOf((int)eingabe.nval);
 if(text.length!=14)
  throw Exception("Ungültiges Datum in Zeile "+eingabe.lineno());
 int jahr = Integer.parseInt(text.substring(0,4))-1900;
 int monat = Integer.parseInt(text.substring(4,6))-1;
 int tag = Integer.parseInt(text.substring(6,8));
 int stunde = Integer.parseInt(text.substring(8,10));
 int minute = Integer.parseInt(text.substring(10,12));
 int sekunde = Integer.parseInt(text.substring(12,14));
 return new Date(jahr,monat,tag,stunde,minute,sekunde);
}

Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »Chromanoid« (02.11.2011, 14:07)


10

02.11.2011, 15:06

throws Exception hatten wir noch nicht, will da noch nicht selber vorgreifen
aber ansonsten is das ein interessanter Ansatz von dir :-)
Ab einem bestimmten Punkt baut man immer mehr Zeugs in den Code rein statt irgendwas raus um
das Ganze evtl. zu vereinfachen :-)
vor allem unter Zeitdruck bzw. Prüfungsstress/-angst.
„lean over the bowl and then take a dive all of you are dead. i am alive“

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »JoeChip« (02.11.2011, 15:12)


Werbeanzeige