2017-02-01 4 views
0

Ich habe eine Schnittstelle mit Kommentaren, wie die Methoden in Java implementiert werden sollen.Throwing Exceptions bei der Implementierung von Methoden

One interface method with the comments 
<p> If newX is not null, then the method setX changes it's x so that it will be newX. 
If newX is null, then setX throws an IllegalArgumentException without changing anything. 

public void setX(String newX) throws IllegalArgumentException 


My implementation 

public void setX(String newX) throws IllegalArgumentException 
{ 
    if(newX == null) 
     throw new IllegalArgumentException("newX may not be null"); 
    if(newX != null) 
     x = newX; 
} 

Wie würden Sie eine Ausnahme auslösen? Wenn ich sehe, wie es eine Ausnahme auslöst, wenn es null ist, kann ich einfach die zweite if-Anweisung entfernen, wo überprüft wird, ob newX nicht null ist? Irgendwelche Verbesserungen diesbezüglich würden ebenfalls geschätzt werden.

+0

Es sollte newX.setX (x) anstelle von x = newX – alainlompo

+2

Ja, Sie können die 'wenn entfernen (! NewX = null) ', es ist zu diesem Zeitpunkt garantiert nicht null. – nickb

+0

@alainlompo ?? 'newX' ist ein' String', der keine 'setX' Methode hat ... Ihr Vorschlag würde bedeuten, _parameters_ auf' x' zu setzen. Wie genau ist 'x = newX;' falsch? – qxz

Antwort

2

Ihr Code ist korrekt, und Sie haben Recht, dass Sie die zweite if Anweisung entfernen können; Wenn das Programm die dritte Zeile Ihrer Methode erreicht, ist newX sicherlich nicht null.

Sie benötigen auch nicht die throws Deklaration, weil IllegalArgumentException eine Unterklasse von RuntimeException ist. try/catch Blöcke und throws Deklarationen werden nur vom Compiler benötigt, wenn der Code eine Ausnahme auslöst, die nicht eine Unterklasse von RuntimeException ist.

Es ist ein sehr häufiges Muster in Java für illegale Argumente Handhabung:

public returnType method(arguments) { 
    if (an argument is invalid) 
     throw new IllegalArgumentException("Message"); 

    // At this point, you can assume arguments are valid 
    // ... the rest of the method ... 
} 
0

Soweit ich weiß, würde Ihre Implementierung gut funktionieren. Wenn Sie jedoch das IllegalArgument in die if-Anweisung werfen, müssen Sie dies bei der Methodenverzögerung nicht wiederholen.

heißt Ihr könnte schreiben:

public void setX(String newX) 
{ 
    if(newX == null) 
     throw new IllegalArgumentException("newX may not be null"); 
    if(newX != null) 
     x = newX; 
} 

Normalerweise würden Sie verwenden ‚wirft Illegal‘ in der Methodendeklaration, wenn Sie eine nicht behandelte Ausnahme in Ihrem eigenen Code haben.

Zum Beispiel kann Ihre Methode die Zeile Thread.sleep (1000) verwenden, die eine Unterbrechungsausnahme ausgelöst hat. Wenn Sie nicht möchten, dass Ihre Methode dies behandelt, können Sie sie an die ursprünglich aufgerufene Methode weitergeben:

public void run() throws InterruptedException { 

    // code 
    Thread.sleep(1); 
} 

statt

public void run() { 

try { 
    Thread.sleep(1); // delay by 100ms 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 

Nun wird der Code, ob run() wurde müssen genannt werden, die Ausnahme behandeln. Hoffentlich klärt das ein Verständnis auf, du kannst das eine oder andere tun, aber es ist nicht nötig, dass du beides machst.

Verwandte Themen