Exception im Konstruktor / Objekt == null

Status
Nicht offen für weitere Antworten.

Krabat

Bekanntes Mitglied
Folgendes Problem:
Wenn ich in meinem Constructor eine Exception werfe, scheint das Object meiner Klasse nicht erzeugt zu werden, stattdessen bleibt es null. Ist es möglich eine exception im constructor zu werfen und trotzdem das Objekt regulär zu erzeugen?
Was wäre, wenn ich erst in der Methode init die Exception werfen würde?


Code:
public Log(int filterLv) throws LogInitException {
            // überprüft, ob der parameter filterlevel in den legalen Grenzen liegt
	    if (filterLv >= ALL_LEVELS_MIN && filterLv <= ALL_LEVELS_MAX) {
		    fatalError		= false;
		    init(output);
	    } else {
	        fatalError = true;
            throw new LogInitException(
	        "Filter Level out of Range! Legal range: " +
	        ALL_LEVELS_MIN + " - " + ALL_LEVELS_MAX);
        }
}
 
B

Beni

Gast
Falls eine Methode eine Exception wirft, kann sie keinen Rückgabewert zurückgeben, da sie nie ein "return" erreicht.

Mit einem Konstruktor passiert dasselbe: der Rückgabewert - das neue Objekt - kann nicht zurückgegeben werden.

Du kannst natürlich innerhalb des Konstruktors einen try-catch-Block machen, aber allgemein gilt: falls etwas eine Exception wirft, muss man entsprechend den veränderten Umständen reagieren...

(Du könntest zwar direkt im Konstruktor "this" auf z.B. eine statische Variable abspeichern, aber diese Lösung ist dann doch ein sehr seltsames Design.)
 

Krabat

Bekanntes Mitglied
hmmm....

es geht mir darum, dass das Logging Tool als komplettes Paket weiter in weiteren Projekten einsetzbar sein soll. Tritt ein Fehler bei der Initialisierung auf, soll eine Exception geworfen werden.
Trotzdem gibt es im Programm viele weitere Aufrufe des Logs, die dann versuchen eine Methode von einem Objekt zu erzeugen, welches null ist. Um dies zu umgehen, dachte ich mir, diesen einen boolean "fatalError" zu setzen, der dafür sorgt, daß die LogMessages einfach nichts mehr tun. Leider bleibt noch immer das Problem, daß das Objekt null ist.

Wie könnte ich das schlauer lösen?
 
B

Beni

Gast
Wirf gar keine Exception. Dann hast du eine beschädigte Instanz, aber in diesem Fall besser als gar keine.

Ich würde den Konstruktor erweitern auf:
Code:
public Log(int filterLv, boolean throwException) throws LogInitException{
       if (filterLv >= ALL_LEVELS_MIN && filterLv <= ALL_LEVELS_MAX) {
          fatalError      = false;
          init(output);
       } else {
           fatalError = true;

           if( throwException ){  // falls der Client eine Exception wünscht: bitte soll er sie haben. Ansonsten geht es hier ganz normal weiter
               throw new LogInitException(
                "Filter Level out of Range! Legal range: " +
               ALL_LEVELS_MIN + " - " + ALL_LEVELS_MAX);
            }
        } 
}

Dann kann später der Programmierer entscheiden, ob er eine Exception (und damit einen null-Logger) oder keine Exception, dafür ein halb-funktionierendes Ding haben will.

daß die LogMessages einfach nichts mehr tun.
Ich würde irgendwo eine riesige Warnlampe aufstellen (JOptionDialog oder so, ERROR_MESSAGE), und das Problem nicht unter den Teppich kehren :wink:
 
R

Roar

Gast
mach doch einfach eine factory methode public static Log createLog(Bla param) throws BlaException

so wird entweder eine exception geworfen oder das objekt wird zurückgelifert, und der benutzer der methode weiß das..
 

Krabat

Bekanntes Mitglied
Danke für Eure Anregungen.

Ich finde es wichtig, daß eine Exception geworfen wird, damit deutlich wird, dass etwas schief gelaufen ist. Damit aber weiterhin auf das Log Objekt zugegriffen werden kann (weil die log Aufrufe im ganzen Programm verteilt sind), darf es nicht null sein, also keine Exception im Konstruktor geworfen werden.

Also wird es wohl (beim Aufruf) auf sowas rauslaufen...

Code:
...
try {
    Log log = new Log();  // hier kann keine Exception geworfen werden
    log.init(paras...);       // hier wird evtl. eine Exception geworfen
}
catch (...) {...} ...
Finde ich persönlich zwar nicht sonderlich schön, aber ich sehe zur Zeit nur diese Möglichkeit und die vo Beni vorgeschlagene.



Das mit der FactoryMethode finde ich auch sehr interessant, habe es mir durchgelesen, aber trotzdem muss (für meinen Fall) erst ein instanziiertes Objekt vorhanden sein, oder? Wenn man als einzigen Aufruf hat...

Code:
public static Log createLog(Bla param) throws BlaException

...und es wird eine Exception geworfen, ist das Objekt wieder null, oder?
 

Krabat

Bekanntes Mitglied
Oh!

oder das ganze in den catch block:

Code:
...
try {
    Log log = Log.createLog(paras...);     // hier wird evtl. eine Exception geworfen
}
catch (LogInitException) {
    log = new Log();                  // hier kann keine Exception geworfen werden
} ...

...ist aber auch nicht so ganz astrein vom design....
 

Tobias

Top Contributor
Zu diesem Problem gibt es sogar ein Pattern: Special Case oder Null Objekt (je nach Autor).

Lagere die Signaturen der Mathoden in ein Interface aus. Lege eine Implementierung des Interfaces an, die nichts tut - das Null-Objekt und ein Implementierung, die das tut, was eigentlich vorgesehen ist. Sollte jetzt bei der Instanziierung des letzteren Objekts etwas schief gehen, hast du immer noch das Null-Objekt, das zwar nichts tut, aber definitiv Exceptions vermeidet.
In einem Buch fand ich den Hinweis, man möge den Nullfall doch als anonyme innere Klasse des Interfaces anlegen; mit folgendem Code-Beispiel:

Code:
public interface Interface {

    public void something();

    public static NullObject NULL = new NullObject() {
        
        public void someMethod() {
            // does nothing
        }
    }
}

mpG
Tobias
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Exception in Konstruktor - trotzdem wird Objekt erzeugt! Allgemeine Java-Themen 3
T Konstruktor löst exception aus Allgemeine Java-Themen 7
H Object cast exception Allgemeine Java-Themen 7
W Queue.remove() -> no such element exception Allgemeine Java-Themen 17
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
N Kann ich die Nullpointer Exception umgehen Allgemeine Java-Themen 12
N A java Exception has occured Allgemeine Java-Themen 8
G javafx "class path" exception Allgemeine Java-Themen 5
H Interface PluginSystem ClassNotFound exception für library Klassen Allgemeine Java-Themen 10
tom.j85 Exception bei Abfrage von Ländercodes in API? Allgemeine Java-Themen 13
S Exception Allgemeine Java-Themen 5
LimDul Streams und Exception Allgemeine Java-Themen 8
C FileLock - Exception wird immer geworfen Allgemeine Java-Themen 4
S Wertbeschränkung Exception oder Anpassung? Allgemeine Java-Themen 4
D Nullpointer Exception Problem Allgemeine Java-Themen 5
Kirby.exe Nullpointer Exception bei Queue Allgemeine Java-Themen 5
R Schlüsselworte "Throw new exception" gibt nicht den String als Fehlermeldung aus Allgemeine Java-Themen 2
P Swing Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: npoints > xpoints.length || npoints > ypoints.length Allgemeine Java-Themen 5
S RMI Exception Allgemeine Java-Themen 0
S MSSQL Exception & Connection String Allgemeine Java-Themen 19
S Interface, generischer Datentyp, Exception? Allgemeine Java-Themen 3
coolian warum bekomme ich ein string index out of bounds exception Allgemeine Java-Themen 17
B Aufruf der Methode ergibt eine Exception Allgemeine Java-Themen 13
S Exception in thread "main" java.lang.NullPointerException at FamilienApp.main(FamilienApp.java:15) Allgemeine Java-Themen 1
M Klassen Serializable Exception Allgemeine Java-Themen 1
E HILFE !! Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/io/FileUtils Allgemeine Java-Themen 4
E Thread Exception Allgemeine Java-Themen 6
javaerd Binomialkoeffizient ausrechnen, Exception in thread "main" java.lang.StackOverflowError Allgemeine Java-Themen 6
M xlsx File auslesen Exception occured Allgemeine Java-Themen 13
X jvm exception abfangen und an externes Programm schicken Allgemeine Java-Themen 4
G Java/LibGDX File Loading Exception Allgemeine Java-Themen 2
B Exception in Application init method Allgemeine Java-Themen 5
H OOP Testen einer Exception mit JUnit Allgemeine Java-Themen 8
M javafx ComboBox- Nullpointer Exception Allgemeine Java-Themen 6
perlenfischer1984 Dialect class not found exception Allgemeine Java-Themen 15
Thallius Bekomme keine Exception mit Stacktrace mehr. Was habe ich getan? Allgemeine Java-Themen 13
perlenfischer1984 Functionsparameter prüfen und eine Exception werfen !? Allgemeine Java-Themen 11
E Probleme mit nextInt() und Exception Allgemeine Java-Themen 35
Z Exception wird nicht ausgelöst Allgemeine Java-Themen 2
0 Animiertes Gif anzeigen - NullPointer Exception Allgemeine Java-Themen 19
KilledByCheese Dezimal nach Hexadezimal rechner wirft seltsame exception Allgemeine Java-Themen 4
V Compiler-Fehler Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 125, Size: 125 Allgemeine Java-Themen 11
D Codeausführung bevor Exception abgeschlossen ist Allgemeine Java-Themen 11
T FileNotFound Exception Allgemeine Java-Themen 9
L Exception/Error auf JDialog umleiten Allgemeine Java-Themen 2
C Arithmetic Exception, obwohl nichts 0 ist Allgemeine Java-Themen 5
M A Java Exception has occured. Allgemeine Java-Themen 1
J Exception in thread "main" java.lang.NoClassDefFoundError Allgemeine Java-Themen 4
M Exception in thread "AWT-EventQueue-0" Allgemeine Java-Themen 6
P Input/Output java.util.Scanner in einer Schleife und Exception-Behandlung: Einlesen einer Zahl Allgemeine Java-Themen 4
E A Java Exception Has Occured Allgemeine Java-Themen 4
T Exception handling Allgemeine Java-Themen 7
P lazy loading exception Allgemeine Java-Themen 0
A Interpreter-Fehler OutOfMemory Exception mit Base64 decode Allgemeine Java-Themen 3
S Java Applet Crash - Keine Exception Allgemeine Java-Themen 8
S Best Practice verschiedene Exceptions fangen und neue Exception erzeugen Allgemeine Java-Themen 11
K Exception in thread "AWT-EventQueue-1" Allgemeine Java-Themen 2
K Gepacktes Jar-File gibt beim Doppelklick eine Exception aus Allgemeine Java-Themen 4
P Eigene Exception Klasse Allgemeine Java-Themen 7
N Java Interne Exception Allgemeine Java-Themen 4
B JUnit4 Exception-Test Allgemeine Java-Themen 4
127.0.0.1 SQL Exception, kein Driver Allgemeine Java-Themen 9
S Erste Schritte Exception beendet Schleife nicht - Methode macht trotz throw weiter? Allgemeine Java-Themen 9
R ZIP FileSystem unter Windows wirft exception Allgemeine Java-Themen 7
H java.util.Timer und Funktion mit SQL Exception Allgemeine Java-Themen 5
Ollek Barcode mit Barcode4J erzeugen - Exception Allgemeine Java-Themen 4
Z Concurrent Modification Exception - HashMap (kein remove) Allgemeine Java-Themen 4
E Eigene Exception Klasse erstellen Allgemeine Java-Themen 3
L Variablen IO Exception weil File angeblich nicht exisitert Allgemeine Java-Themen 10
T Exception versus Rückgabeparamter Allgemeine Java-Themen 26
S Exception enableDepthTest Allgemeine Java-Themen 7
M JAXB Reimport zu Hibernate DB -> Exception Allgemeine Java-Themen 3
W Kleine Frage zu Null-Pinter-Exception Allgemeine Java-Themen 21
aze JUnit: Testen ob bestimmte Exception nicht auftritt Allgemeine Java-Themen 18
S Null Pointer Exception bei BufferedReader Allgemeine Java-Themen 4
N Runtime.exec() Exception Problem Allgemeine Java-Themen 3
P Default constructor cannot handle exception type Allgemeine Java-Themen 6
M Objekt prüfen auf null ->Invocation Target Exception??? Allgemeine Java-Themen 2
S Bildaufbau durch Servlet -> Exception Allgemeine Java-Themen 11
E Queue: Wie kann hier ein null-Pointer Exception auftreten?! Allgemeine Java-Themen 11
S Exception beim Schreiben des Dataset in XML Datei Allgemeine Java-Themen 8
M Webstart Exception trotz signierten JARs Allgemeine Java-Themen 3
E Interpreter-Fehler unbekannte Exception Allgemeine Java-Themen 12
B Komische Exception Allgemeine Java-Themen 4
U SwingWorker und Exception Allgemeine Java-Themen 3
B Nullpointer Exception in Array Allgemeine Java-Themen 15
G WebService Exception Allgemeine Java-Themen 3
M Best Practices Exception Handling für eigene library Allgemeine Java-Themen 8
G PermSpace Exception Allgemeine Java-Themen 2
S Invalid Chunk Exception Allgemeine Java-Themen 3
N URLClassLoader Exception Allgemeine Java-Themen 5
Apo Java Sound Mark/Reset Exception Allgemeine Java-Themen 14
M Exception ganz sehen Allgemeine Java-Themen 2
D Problem mit EasyMock und Exception Allgemeine Java-Themen 6
B Exception wird geworfen, ich darf sie aber nicht abfangen. Allgemeine Java-Themen 10
7 Exception wird nicht aufgefangen Allgemeine Java-Themen 8
C Desktop.mail Problem. IO Exception: Failed to open. Allgemeine Java-Themen 3
L [Exception] RSA Verschlüsselung. Allgemeine Java-Themen 16
Final_Striker Exception bei neuem Look und Feel Allgemeine Java-Themen 2
N Exception beim auslesen einer JTable Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben