java try块中定义的变量的范围是什么?为什么在try块之外无法访问它?

时间:2015-09-27 08:00:50

标签: java try-catch

在下面的java程序中,即使成员" x"在try块之外定义,它可以在try块内访问。在" y"的情况下,它在try块内定义。但是在try块之外无法访问它。为什么会这样?

package com.shan.interfaceabstractdemo;

public class ExceptionDemo {
    public static void main(String[] args) {
        int x = 10;
        try {
            System.out.println("The value of x is:" + x);
            int y = 20;
        } catch (Exception e) {
            System.out.println(e);
        }
        System.out.println("The value of y is:" + y);
    }
}

输出是:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
y cannot be resolved to a variable

at com.felight.interfaceabstractdemo.ExceptionDemo.main(ExceptionDemo.java:12)

2 个答案:

答案 0 :(得分:5)

任何{}块都在Java中定义范围。因此,在try块内声明的任何变量(例如y)只能在try块内访问。

x在包含您的try块的外部块中声明(这是整个main方法的块),因此可以在try块中访问它。

答案 1 :(得分:1)

Java中的每个局部变量(方法的变量)都有一个由{}块分隔的范围,在该块中声明它:变量是可访问的,在变量不可访问的范围内。换句话说,您声明的变量仅存在于声明它的{}中。

在您的示例中,变量x的范围在方法本身内,而y的范围在try块内:

public static void main(String[] args) { 
    // here x scope begins
    int x = 10;
    try { // here y scope begins
        System.out.println("The value of x is:" + x);
        int y = 20;
    } // here y scope ends
       catch (Exception e) {
        System.out.println(e);
    }
    System.out.println("The value of y is:" + y);
}
// here x scope ends

为了确保哪个是局部变量的范围,您必须在声明变量作为范围的开头之前立即考虑第一个{,并将关闭左括号的}视为结束 - 注意后者不一定是第一个右括号,因为在变量声明之后可能存在{}块的其他嵌套级别(在您的示例x中嵌套{}由于右括号}是关闭主方法的那个,因此仍然可以访问变量的块。