Wann ist ein Parameter Check sinnvoll

Hallo ich habe mal eine generelle Frage :

Java:
public class Competition {

    public Competition(String competitionName) {
        // check parameter competitionName
      
    }
}

public class DataManager {

   public void createCompetition(String competitionName){

     // check parameter competitionName
     Competition c = new Competition(competitionName);
   }

}

Der DatenManager ist die generelle Datenklasse. Es erzeugt ein Competition mit dem competitionName. Nun meine Frage. In der Funktionen createCompetition und im Constructor wird der Parameter competitionName geprüft und im Fehlerfall eine Exception geworfen (ist hier nicht im Code). Ist dies sinnvoll in jeder Funktion den Parameter zu prüfen oder nur im Construcor.
 

Flown

Administrator
Mitarbeiter
Es kommt immer darauf an. Wird dein Parameter am Anfang oder mitten in der/m Methode/Konstruktor verarbeitet? Wenn er am Anfang abgearbeitet ist und der Sub-call - wie bei dir - den Parameter prüft, dann brauchst du ihn nicht erneut zu prüfen. Doch wenn er nicht am Anfang geprüft wird, dann sollte auf jedenfall gecheckt werden. Das verhindert unnötiges Debuggen! Aber das allerwichtigste ist und bleibt: DOKUMENTATION! Dann sieht das ganze auch so aus.

Java:
class Competition {
  
  public Competition(String competitionName) {
    Objects.requireNonNull(competitionName);
    // ...
  }
}

class DataManager {
  /**
   * Creates a new {@link Competition} and ... .
   * 
   * @param competitionName
   *          name of the new {@link Competition}
   * @throws NullPointerException
   *           if {@code competionName} is {@code null}
   */
  public void createCompetition(String competitionName) {
    Competition c = new Competition(competitionName);
    // ...
  }
  
}
 
K

kneitzel

Gast
Diese Antwort hat bei mir einiges Nachdenken und Nachforschen ausgelöst. Ich will meine aktuelle Sicht einfach einmal kurz darstellen:

- Ich habe bisher immer einen manuellen Check auf == null durchgeführt und dann eine IllegalArgumentException geworfen. Zu der Frage NPE vs. IAE gibt es einiges zu lesen und ich denke, ich werde zukünftig auch zu der NPE tendieren. Auch der Aufruf mit Objects.requireNonNull war mir bisher unbekannt und ist eine gute Sache, die ich zukünftig dann auch nutzen werde.

- Ich selbst prüfe generell die Argumente. In jeder Funktion. Egal ob "public API" oder "internal API" oder was in Argumentationen gerne angebracht wird.
a) Es ist doch egal, ob jemand anderes die Klassen / Funktionen nutzt oder ich. Wenn da kein null Wert rein darf, dann darf das nicht sein. Wenn da dann irgendwo ehh eine NPE auftritt, dann ist es ein Fall von Glück gehabt. Aber evtl. läuft ja alles durch (dann schafft es ein Bug ggf. bis zum Kunden) oder evtl. werden gar Daten korrumpiert (Worst Case!) Daher: Daten werden immer so gut wie möglich geprüft.
b) Das Argument bezüglich "das Argument wird ja im nächsten Call dann mit geprüft" mag zwar jetzt stimmig sein. Aber wer weiss, was die Zukunft bringt? Dann wird Competition geändert und nimmt plötzlich auch einen null Wert (aber bei der aufrufenden Methode ist das immer noch fatal!) oder es ändert sich sonst irgendwas und plötzlich fehlt dieser check wirklich...

Aber ich bin auch durch .Net geprägt und die Code Analysis Tools, die wir einsetzen, verlangen einen Check der Argumente ansonsten gibt es eine Warnung (Die unsere Build-Tools als Error werten und daher eine Nacharbeitung erfordern).
 

Flown

Administrator
Mitarbeiter
Alles zu prüfen ist nicht immer das gewünschte. Es kommt immer darauf an ob null ein Fehlerfall ist, oder nicht. Im obigen Beispiel ist DataManager#createCompetition null-tolerant, doch der Sub-Call nicht. Wenn in späterer Folge sich das ändert und der Subcall auch null-tolerant wird, dann ändert sich nur die Java-Doc und nicht der Code... und falls man das zu ändern vergisst -> egal. Darum ist es immer use-case abhängig und es sollte nicht immer, alles geprüft werden.
 
K

kneitzel

Gast
Also das ist in meinen Augen eben nicht egal. Das Verhalten ist klar beschrieben und bei der Entwicklung von DataManager#createCompetition muss man als Entwickler klar festlegen, was erlaubte Werte sind und was nicht.
Wenn null keinen Sinn macht, dann verbiete ich das. Wenn null Sinn macht, dann habe ich bei der Implementation sicher zu stellen, dass es wirklich funktioniert und habe diesen Fall auch zu testen. Solche Dinge einfach nicht zu testen (so a.la. evtl. ändert sich das Verhalten ja eines Tages) halte ich für fahrlässig, da ich als Entwickler damit das Verhalten meiner Klassen nicht sicher stelle (und auch die Klasse nicht voll teste).
Es so zu schreiben mag ja ok sein. Aber ein Unit-Test, der sicher stellt, dass da dann wirklich eine NPE geworfen wird, würde ich dann aber schon als Minimum erwarten.

Aber das ist eine Ansichtssache. Und mag sein, dass ich da durch die Arbeit im Team hier stark geprägt bin diesbezüglich.
 

Joose

Top Contributor
Wenn null keinen Sinn macht, dann verbiete ich das. Wenn null Sinn macht, dann habe ich bei der Implementation sicher zu stellen, dass es wirklich funktioniert und habe diesen Fall auch zu testen.

Und das wäre meiner Meinung nach im Konstruktor von Competition (und nur dort).
Wenn die createCompetition Methode von DataManager nun ebenfalls prüft, habe ich 2 Stellen zu ändern! -> es handelt sich dabei (meiner Meinung nach) um duplicate Code
 
K

kneitzel

Gast
Ok, das Argument ist gut und gibt Deiner Position einiges mehr an Gewicht, als ich bisher gesehen habe.
 

Flown

Administrator
Mitarbeiter
Ahhh das kam jetzt falsch rüber. Bitte Tests jetzt mal beiseite schieben, das ist ein ganz anderes Thema. Bleiben wir einfach mal wo Parameter geprüft werden sollen, anhand von meinem obigen Beispiel.
Ich erweitere es um ein paar Nuancen, damit man den Sinn eventuell besser versteht.
Java:
class Competition {
  private String competitionName;
 
  /**
   * Creates a new {@code Competition} instance.
   *
   * @param competitionName
   *          name of the competition
   * @throws NullPointerException
   *           if {@code competitionName} is {@code null}
   */
  public Competition(String competitionName) {
    this.competitionName = Objects.requireNonNull(competitionName);
  }
 
  // getter/setter
}

class DataManager {
  private List<Competition> competitions = new ArrayList<>();
 
  /**
   * Creates a new {@link Competition} and adds it to the List.
   *
   * @param competitionName
   *          name of the new {@link Competition}
   */
  public void createAndAddCompetition(String competitionName) {
    Competition c = new Competition(competitionName);
    competitions.add(c);
  }
}
Hier in der Methode createAndAddCompetition bin ich null-tolerant, da ich eine Instanz erstelle und es meine Liste hinzufüge. Ich verarbeite den Parameter nicht direkt.
Im Gegensatz zu dem Konstruktor aus Competition. Hier brauch ich diesen Check und der StackTrace sollte genau diese Stelle hier ausgeben, weil genau hier erlaube ich keinen null-Wert.
Nur als Hinweis könnte ich in der Dokumentation schreiben, dass eine NPE fliegen könnte, wenn einen neuen Instanz von Competition erstellt wird.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Parameter oder Attribut (wann nehme ich was?) Allgemeine Java-Themen 12
M Exceptions - wann / wie verwenden? Allgemeine Java-Themen 4
LimDul Spezifkation, wann es deprecation Warnings gibt Allgemeine Java-Themen 1
N Streams wann .filtern? Allgemeine Java-Themen 2
T GUICE- Dependency Injection- WANN nutze ich Providers? Allgemeine Java-Themen 2
B Erkennen, wann Prozess beendet ist, dann Thread beenden. Allgemeine Java-Themen 6
D Wann sollte ich statische Methoden und Variablen benutzen? Allgemeine Java-Themen 44
Rudolf Wann System.exit und wann dispose? Allgemeine Java-Themen 9
L Checkstyle: Wann ist eine Methode für Vererbung entworfen? Allgemeine Java-Themen 13
X Wann ist Runtime.getRuntime().exec mit Copy fertig? Allgemeine Java-Themen 10
M Wann ist MVC sinnvoll? Allgemeine Java-Themen 14
M Wann Membermethoden, wann statische Utility-Methoden? Allgemeine Java-Themen 24
Ark Wann 64 Bit-Befehle im Einsatz? Allgemeine Java-Themen 6
G Wann normale Exception und wann Runtimeexception Allgemeine Java-Themen 12
Y Wann folgende Technologien benutzen Allgemeine Java-Themen 5
M Wann verwendet man PropertyChangedEvents, wann eigene? Allgemeine Java-Themen 3
F Wann und wie Exceptions einsetzen? Allgemeine Java-Themen 13
G Wann statische Methoden, statische Attributen? Allgemeine Java-Themen 7
G Ab wann Datenbank verwenden Allgemeine Java-Themen 15
B Wann Interface und wann Adapter Allgemeine Java-Themen 4
B ObjectInputStream - Wann ist Ende erreicht? Allgemeine Java-Themen 10
D Wann ist das ergebnis einer Rechnung eine Double? Allgemeine Java-Themen 7
M Maximal verfügbarer Hauptspeicher? Ab wann wird ausgelagert? Allgemeine Java-Themen 13
P Wann kommt denn nun 1.5 überhaupt? Allgemeine Java-Themen 6
F KI / Machine Learning Parameter verschachtelte for Schleifen Allgemeine Java-Themen 2
F KI / Machine Learning Parameter verschachtelte for Schleifen Allgemeine Java-Themen 1
8u3631984 Funktions Parameter mit Lombok "NonNull" annotieren wird in Jacococ Testcoverage nicht herausgefiltert Allgemeine Java-Themen 3
JavaJüngling beliebige Collection die Comperable Elemente enthält als Parameter Allgemeine Java-Themen 37
M Datensatz auf ein bestimmten Parameter einzugrenzen Allgemeine Java-Themen 11
B JAX - RS.... Multiple parameter application/x-www-form-urlencoded.... Allgemeine Java-Themen 6
B Parameter Konstruktor plus rechnen Allgemeine Java-Themen 6
L Die abzuleitende Klasse als Parameter übergeben Allgemeine Java-Themen 4
W Haben Konstruktoren in Java eigentlich immer mindestens einen Parameter? Allgemeine Java-Themen 4
I Array Parameter mit 2 Klassen - NullPointerException Allgemeine Java-Themen 3
F URI mit Parameter klappt nicht Allgemeine Java-Themen 1
H Aufruf eines Web Service anhand übergebenen Parameter Allgemeine Java-Themen 2
temi best practice: Parameter überprüfen, wo? Allgemeine Java-Themen 9
S Parametrisierte jUnit 5-Tests mit eigenen Datentypen/Klassen-Objekten als Test-Parameter Allgemeine Java-Themen 0
MiMa If-Abfrage mit Parameter Allgemeine Java-Themen 8
I Javaaufruf aus Batch inkl. Parameter (Adminrechte) Allgemeine Java-Themen 2
P Java https proxy (-Dhttps.proxyHost) Start-Parameter funktioniert nicht? Allgemeine Java-Themen 2
Neumi5694 Methoden Generic: Rückgabetyp als Class-Parameter übergeben Allgemeine Java-Themen 3
K Java FX Zu startenden FXML-Controller per Parameter wählen Allgemeine Java-Themen 2
F Enum-werte als Methoden-Parameter übergeben Allgemeine Java-Themen 6
T Klassen Parameter weitergabe Allgemeine Java-Themen 1
C Überschreiben mit kontravariante Parameter Allgemeine Java-Themen 13
M Parameter auslesen im Servlet Allgemeine Java-Themen 0
Neumi5694 Vererbung Parameter muss 2 Bedingungen erfüllen Allgemeine Java-Themen 2
Sogomn Methode als Parameter? Allgemeine Java-Themen 3
T Parameter Allgemeine Java-Themen 6
R Parameter Adapter - Design Allgemeine Java-Themen 1
I Methode verallgemeinern (Methode als Parameter)? Allgemeine Java-Themen 10
F In OSX: Java-Programm über URI-Scheme aufrufen mit Parameter? Allgemeine Java-Themen 0
H Generics als Parameter Allgemeine Java-Themen 1
N [stream-api] Parameter pro Typ zählen Allgemeine Java-Themen 1
OnDemand Maximale Parameter Allgemeine Java-Themen 5
M final vor dem parameter eines Konstruktors Allgemeine Java-Themen 1
S Servlet, per URLConnection Mit String Http Parameter mitsenden Allgemeine Java-Themen 3
M Parameter-Datei einlesen (zeilenweise); Dateiintegrität Allgemeine Java-Themen 7
H JasperReport: Parameter befüllen Allgemeine Java-Themen 7
Joew0815 JList + JTableModel: Parameter der Tabelle übergeben Allgemeine Java-Themen 10
Y Applet/Html - Wie Java-Methode aufrufen, die einen Parameter erwartet? Allgemeine Java-Themen 3
G Polymorphie Funktion als Parameter Allgemeine Java-Themen 8
G Methoden Unterschiedliche viele Parameter Allgemeine Java-Themen 17
F Parameter im Link /jar-Aufruf Allgemeine Java-Themen 12
S OOP Designrichtlinie Parameter Prüfung Allgemeine Java-Themen 7
C char und char-Array als parameter übergeben Allgemeine Java-Themen 6
B Array Parameter Problem Allgemeine Java-Themen 3
C Reflektions, Benutzer soll Konstruktor auswählen und Parameter übergeben können Allgemeine Java-Themen 5
S Keytool: mögliche Werte für Parameter Allgemeine Java-Themen 4
H Externes Programm, Parameter Allgemeine Java-Themen 6
C Webservice: XML Parameter übergabe. Allgemeine Java-Themen 7
M Session-Parameter setzen? Allgemeine Java-Themen 10
P VM-Parameter -D... Allgemeine Java-Themen 3
V Wildcard aus Parameter in return type Allgemeine Java-Themen 2
O Collections Eigene Methodenzusicherung bei Collections als Parameter Allgemeine Java-Themen 2
W ScriptEngine + Wie Parameter übergeben bei Fukntion? Allgemeine Java-Themen 2
A Reflection Konstruktor Parameter Supertyp Allgemeine Java-Themen 2
F Parameter für Java Applikation per xml ins Meta-inf speichern? Allgemeine Java-Themen 3
J BlueJ Methode hat zu viele Parameter Allgemeine Java-Themen 6
R VM-Error - BadWindow (invalid Window parameter) Allgemeine Java-Themen 4
J Parameter an Java übergeben Allgemeine Java-Themen 10
S Neue Instanz eines Objekts erzeugen - Konstruktor erhaelt Parameter. Allgemeine Java-Themen 5
P VM Parameter und .jar Allgemeine Java-Themen 3
L Parameter-Objekte verändern oder nicht? Allgemeine Java-Themen 6
J Parameter absichtlich für außen verändern Allgemeine Java-Themen 4
A wie kann man Parameter an ein Task übergeben? Allgemeine Java-Themen 3
Iron Monkey Singleton mit Parameter Allgemeine Java-Themen 14
G setter und getter: Parameter Überprüfung Allgemeine Java-Themen 6
G JVM Parameter Allgemeine Java-Themen 7
G Parameter Bedeutung Allgemeine Java-Themen 4
W Properties-Klasse: mehrere Parameter-Belegungen übergeben? Allgemeine Java-Themen 2
J Unicode: cmd parameter (main args); exec params; filenames Allgemeine Java-Themen 2
C US_export_policy.jar und local_policy.jar VM Parameter Allgemeine Java-Themen 1
J Casten ueber generischen Parameter? Allgemeine Java-Themen 5
T Parameter einer Klasse auf Interface prüfen Allgemeine Java-Themen 6
G generische Klasse als Parameter einer generischen Klasse Allgemeine Java-Themen 5
S .rar-Dateien ein Passwort als Parameter übergeben Allgemeine Java-Themen 5
N Funktion als Parameter einer anderen Funktion Allgemeine Java-Themen 5
D Parameter parsen? Allgemeine Java-Themen 15

Ähnliche Java Themen

Neue Themen


Oben