我们可以在方法中创建一个IIB(实例初始化块)吗?如果我们不能解释为什么它没有给出编译时错误?

时间:2017-01-19 06:39:57

标签: java

朋友们我很困惑,在编码的时候我意外地在一个方法中出现了一个开始和结束的大括号

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"));
        }
        {

        }
    }
}

您可以在 while-loop 中的 if-block 下方看到。任何人都可以帮忙,为什么它没有给出任何编译时错误或它是什么?

2 个答案:

答案 0 :(得分:3)

这不是instance initializer。实例初始值设定项在类或枚举体中声明,而不是在方法中声明。

这只是一个空的block:不必要,但仍然合法。

可以安全地删除空块和空语句:

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

[UPDATE]:从技术上讲,可以使用块来分隔范围。例如:

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

在这种情况下,具有相同名称的变量在不同的范围内声明。

答案 1 :(得分:3)

您在这里所做的只是创建另一个,它会创建一个新范围。在方法中,每对{}定义范围。在一个范围中定义的变量不能在该范围之外使用。例如,这个if语句:

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

没有{}if或任何其他控制流结构的while也是一个范围。它将无条件执行:

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

这些范围中的变量也表现相同:

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

这有用吗?

我认为这是非常不必要的,我从未在生产代码中使用它。