📜  在Java中使用最终和非最终变量的无法访问的语句

📅  最后修改于: 2022-05-13 01:54:25.824000             🧑  作者: Mango

在Java中使用最终和非最终变量的无法访问的语句

Java中无法访问的语句是指那些语句集 在程序执行期间不会被执行的语句称为不可访问语句。由于以下原因,这些语句可能无法访问:

  • 在他们面前有一个退货声明
  • 在他们面前有一个无限循环
  • 执行在他们面前被强行终止

示例 1

Java
// Java program to Illustrate Unreachable Statement
// Throwing Exception
// Using Final Variable
 
// Class 1
// Main class
class UnreachableUsingFinal {
 
    // Declaring and initializing final variable
    final int a = 14, b = 16;
 
    // Method of this class
    void compare()
    {
 
        // Checking if number is lesser or not
        while (a < b) {
 
            // First print statement
            System.out.println(
                "Hello i am in infinite loop");
 
            // last print statement, in this case
            // unreachable
            System.out.println("Unreachable statement");
        }
    }
}
 
// Class 2
// Main class
class GFG {
 
    // Main driver method
    public static void main(String args[])
    {
 
        // Creating object of class 1 inside main()
        UnreachableUsingFinal uuf
            = new UnreachableUsingFinal();
 
        // Calling the method of class 1
        uuf.compare();
    }
}


Java
// Java program to Illustrate Unreachable Statement
// Running Into Infinite Loop
// Using Final Variable
 
// Class 1
// Main class
class UnreachableUsingFinal {
 
    // Declaring and initializing final variable
    final int a = 14, b = 16;
 
    // Method of this class
    void compare()
    {
 
        // Checking if number is lesser or not
        while (a < b) {
 
            // First print statement
            System.out.println(
                "Hello i am in infinite loop");
        }
    }
}
 
// Class 2
// Main class
class GFG {
 
    // Main driver method
    public static void main(String args[])
    {
 
        // Creating object of class 1 inside main()
        UnreachableUsingFinal uuf
            = new UnreachableUsingFinal();
 
        // Calling the method of class 1
        uuf.compare();
    }
}


Java
// Java program to Illustrate unreachable Statement
// Without using final variable
 
// Class 1
// Helper class
class UnreachableWithoutUsingFinal {
 
    // Initialisation of variable
    int a = 14, b = 16;
 
    // Method of this class
    void compare()
    {
 
        // Checking if two numbers are equal or not
        while (a < b) {
 
            // First print statement
            System.out.println(
                "Hello i am in infinite loop");
        }
 
        // Last print statement, in this case reachable
        System.out.println("Unreachable statement");
    }
}
 
// Class 2
// Main class
class GFG {
 
    // Main driver method
    public static void main(String args[])
    {
 
        // Creating object of class 1
        UnreachableWithoutUsingFinal uwuf
            = new UnreachableWithoutUsingFinal();
 
        // Calling method of class 1
        uwuf.compare();
    }
}


输出:

输出说明:

这是因为语句'System.out.println(“Unreachable statement”)'永远不会被执行,并且Java不支持 unreachable 语句。使这些变量成为 final 也使它们成为常量变量,并且在Java或任何其他编程语言中,常量变量的值不能更改。因此,在程序的整个生命周期中,不会有任何条件退出 while 循环。
这反过来又使第二个语句无法访问,即 JVM 在程序生命周期内无法访问该语句。因此,它给出了“无法访问的语句”错误。在这里,如果从编码的角度来看,程序是正确的,但实际上 JVM 的想法是,如果在任何情况下都没有执行语句,那么使用该语句有什么需要呢?所以,尽量避免这种情况。

如果上面的syso语句被注释了怎么办?

极客你一定想知道如果它被注释掉或删除,那么预期的输出将会是什么。是的,您是对的,请考虑一下,因为所需的代码也将满足包含无法访问语句的条件。在程序中如下图所示:

示例 2

Java

// Java program to Illustrate Unreachable Statement
// Running Into Infinite Loop
// Using Final Variable
 
// Class 1
// Main class
class UnreachableUsingFinal {
 
    // Declaring and initializing final variable
    final int a = 14, b = 16;
 
    // Method of this class
    void compare()
    {
 
        // Checking if number is lesser or not
        while (a < b) {
 
            // First print statement
            System.out.println(
                "Hello i am in infinite loop");
        }
    }
}
 
// Class 2
// Main class
class GFG {
 
    // Main driver method
    public static void main(String args[])
    {
 
        // Creating object of class 1 inside main()
        UnreachableUsingFinal uuf
            = new UnreachableUsingFinal();
 
        // Calling the method of class 1
        uuf.compare();
    }
}

输出:

如果 final 关键字本身被删除了怎么办?

示例 3

Java

// Java program to Illustrate unreachable Statement
// Without using final variable
 
// Class 1
// Helper class
class UnreachableWithoutUsingFinal {
 
    // Initialisation of variable
    int a = 14, b = 16;
 
    // Method of this class
    void compare()
    {
 
        // Checking if two numbers are equal or not
        while (a < b) {
 
            // First print statement
            System.out.println(
                "Hello i am in infinite loop");
        }
 
        // Last print statement, in this case reachable
        System.out.println("Unreachable statement");
    }
}
 
// Class 2
// Main class
class GFG {
 
    // Main driver method
    public static void main(String args[])
    {
 
        // Creating object of class 1
        UnreachableWithoutUsingFinal uwuf
            = new UnreachableWithoutUsingFinal();
 
        // Calling method of class 1
        uwuf.compare();
    }
}

输出:

输出说明:

在这里,发生了一件有趣的事情。删除 final 关键字会打印输出。但在这种情况下,最后一个 print 语句也是不可访问的。
因此,它在程序中成为可能 变量被声明为非最终的。因此,可以在程序中更改这些变量的值。 JVM认为在任何时间点都有可能改变a和b的值,最后一条语句可能会被执行,所以第二个程序不会出错。这意味着第二个程序遇到了无限循环,但有可能(因为变量被声明为非最终的)循环可能会终止并且最后一条语句可能会被执行。