Auch wenn es etwas designtechnisches ist, meiner Meinung nach, gibt es für folgendes eine Art “Konvention”?
public String toLower(String input){return input.toLowerCase()};
public void main(){
MyObject obj = new MyObject("World"); //Konstruktor weggelassen, der setzt z.B. nur eine Variable
String lowerName = toLower(obj.getName());
//mache dann irgendwas mit lowerName
}
Was ist nun wenn z.B. der Name nicht gesetzt werden muss und somit null zurückliefert. Wie baut man dann die Exception dazu? In die Methode, in der dann der Übergabewert falsch ist, oder vorher, vor dem Aufruf?
Also
So an sich würde ich Version1 präferieren. Wenn man aber mit der Variablen weiterarbeitet muss man ja doch wissen ob sie null ist, also kann man ja die zweite Version nutzen. Aber vllt. kann da nochmal wer anders was dazu sagen .)
Validierung von Parametern sieht man häufig am Anfang der Methode mit direktem throw.
Das spart auch eine ganze Menge if-else ein.
Falls die Validierung zu groß wird (z.B. 9 Zeilen gestaffelteif(...) throw ... auf 3 Zeilen Produktivcode), kann man die validierung auch in einer void-Methode machen (erster Aufruf in der vorigen Methode), die dann die Exceptions hochwirft.
Unchecked/Nicht unchecked macht da erstmal keinen Unterschied.
An einer privaten Methode wird es nicht Teil der API und wie man die Schnittstelle der öffentlichen Methode gestaltet entscheidet man auch selbst.
Intern kann man z.B. auch ohne Probleme Checked-Exceptions fangen und in eine Unchecked-Exception verpacken.
wenn null ein zulässiger Wert ist sollte gar keine Exception geworfen werden. Die Methode sollte geeignet damit umgehen und beispilsweise einen leeren String zurück liefern, so dass es für den nachfolgenden Code transparent bleibt.
Also die Klasse Objects ist mir noch nicht aufgefallen… netter Tip.
Ansonsten lagere ich solche n Zeiler schonmal in check-Methoden aus:
if(obj == null) {
throw new NullPointerException();
}
}
private void checkRange(int index) {
if(index < 0 || index >= max) {
throw new IllegalArgumentException("index out of range" + index);
}
}```Durch die Objects-Klasse erschliessen sich mir da völlig neue Möglichkeiten an die ich noch gar nicht gedacht habe. Ich werde wohl mal über eine weitere Utility-Klasse nachdenken müssen.
@Spacerat : auch zu deiner Lösung gibt es verschiedene Meinungen: NullPointerException oder IllegalArgumentException bei null werfen? Die zweite erscheint mir viel logischer.
[QUOTE=darekkay]@Spacerat : auch zu deiner Lösung gibt es verschiedene Meinungen: NullPointerException oder IllegalArgumentException bei null werfen? Die zweite erscheint mir viel logischer.[/QUOTE]Ok, anstandslos einverstanden.