2017-04-24 8 views
1

Ist es akzeptabel, einen try-Block in einem Konstruktor zu haben? Ich arbeite an einer Aufgabe, die mich auffordert, eine neue Instanz von ServerSocket im Konstruktor zu erstellen. Die Anforderungen waren schaffen mir diese so weit:Try Block in einem Konstruktor?

public class WebServer{ 

private ServerSocket requestListener; 
private static int HTTP_PORT; 
private ExecutorService responses; 

public WebServer() { 
    //Create an instance of RequestListener, and create an instance 
// of ExecutorService with a threadpool size of 100 

} 
} 

Also, wenn ich requestListener = new Serversocket (HTTP_PORT) werde; Innerhalb des Konstruktors benötigt es einen try-Block. Ist das akzeptabel, oder missverstehe ich das?

+1

Sicher, warum nicht? Oder Sie können "Würfe" deklarieren und sich fortpflanzen lassen. – shmosel

+0

Warum versuchst du es nicht selbst - schreibe das try/catch und kompiliere es? Dann müssen Sie uns nicht fragen. –

+0

@ErwinBolwidt Weil einige Dinge, die ich arbeite, und dann wird mir später gesagt, sie sind schlechte Praxis von Menschen, die mehr als ich wissen. Ich möchte es beim ersten Mal richtig machen. –

Antwort

4

Sie sollten den Konstruktor machen eine Exception (mit throws Klausel) werfen als warpping den Code, der die Exception ein Exception in try-catch Block und beim Schlucken werfen.

Wenn Sie beim Versuch, die Socket zu hören, einen Fehler erhalten, ist es sinnlos, eine object zu erstellen, da dies zu unerwartetem Verhalten in der Folge führen kann.

+0

Es ist jedoch in Ordnung, die Ausnahme zu fangen und sie in eine andere Ausnahme umzuwandeln. – biziclop

+0

Richtig, es sollte am Ende wieder an den Aufrufer weitergegeben werden. –

+0

Macht Sinn, danke. –

0

  1. Sie können mit Try-Catch-Blöcke überall. Sie sind sogar noch in den Lambda-Ausdrücken . Sie sehen erschreckend aus, aber wenn Sie die Ausnahme gut behandeln, werden Sie sich daran gewöhnen, wie sie aussehen.

  1. In einigen Unternehmensanwendung Backends Ich habe gesehen:

    try {// etwas } catch (TypeException e) { throw new BackendApiExceptionDTO(); }

Und der Versuch catch-Block hat den kleinsten Umfang möglich.



0

Es erfordert einen Try-Block "nicht. Es erfordert entweder ein Versuch Block oder ein throws Klausel. Letzteres ist, was Sie verwenden sollten. Ein halbgebackenes Objekt nützt niemandem.