2017-01-19 1 views
0

Freunde Ich bin verwirrt, während ich aus Versehen eine Öffnung Codierung und schließenden geschweiften Klammern kamen innerhalb einer MethodeKönnen wir innerhalb einer Methode einen IIB (Instance Initialization Block) erstellen? Wenn wir nicht können Warum gibt es keinen Fehler bei der Kompilierung?

List<EmpQualificationLevelTo> fixedTOs = employeeInfoFormNew.getEmployeeInfoTONew().getEmpQualificationFixedTo(); 
if(fixedTOs != null && !fixedTOs.isEmpty()) 
{ 
    Iterator<EmpQualificationLevelTo> it = fixedTOs.iterator(); 
    while(it.hasNext()) 
    { 
     EmpQualificationLevelTo fixedTO = it.next(); 
     FormFile eduDoc = fixedTO.getEducationDoc(); 
     if((eduDoc != null && eduDoc.getFileName() != null && !eduoc.getFileName().isEmpty()) && (fixedTO.getQualification() != null && !fixedTO.getQualification().isEmpty())) { 
      errors.add("error", new ActionError("knoledgepro.employee.education.uploadWithoutQualification")); 
     } 
     { 

     } 
    } 
} 

Sie können, dass unter denif-Block innerhalb der while-Schleife sehen. Kann jemand helfen, warum gibt es keinen Kompilierzeitfehler oder was ist es?

Antwort

3

Dies ist kein instance initializer. Instanzinitialisierer werden in einer Klasse oder einem enum body deklariert, nicht innerhalb von Methoden.

Dies ist nur eine leere block: unnötig, aber immer noch legal.

Leere Blöcke und leere Aussagen kann sicher entfernt werden:

{ 
    ; 
    ;; 
    //this block compiles successfully 
    ;{} 
} 

[UPDATE]: Technisch kann Blöcke getrennte Bereiche verwendet werden. Beispiel:

{ 
String test = "test"; 
//do something with test 
} 
{ 
String test = "test2"; 
//do something with test 
} 

In diesem Fall werden Variablen mit demselben Namen in separaten Bereichen deklariert.

+3

Ihr einziger Zweck ist es, 'break' zu nennen. Oh ... und um Literale zuzuweisen. – Mordechai

+0

So ** @ MouseEvent ** der Code in diesem Block wird unabhängig von jeder Bedingung ausgeführt, oder? –

+1

Danke ** @ Standard-Gebietsschema ** –

3

Was Sie hier tun, ist nur ein weiterer Block erstellen, die einen neuen Bereich erstellt. In einer Methode definiert jedes Paar {} einen Bereich. In einem Bereich definierte Variablen können nicht außerhalb dieses Bereichs verwendet werden. Zum Beispiel diese if-Anweisung:

if (a == b) { 
    int c = 10; 
    // here I can access c 
} 
// but here, I cannot 

Ihre {} ohne eine if oder while oder andere Kontrollflussstrukturen ist auch ein Rahmen.

in diesen Bereichen
System.out.println("Hello"); 
{ 
    System.out.println("Hello"); 
} // prints 2 "Hello"s 

Die Variablen auch gleich verhalten:

int a = 10; 
{ 
    int b = 20; 
    // can access a and b 
} 
// can only access a 

Wie ist dies nützlich Es wird unbedingt ausgeführt werden?

Ich denke, das ist ziemlich unnötig und ich habe es nie in Produktionscode verwendet.

Verwandte Themen