Java 正向引用

Java 正向引用,java,Java,我是java新手。我有一个关于前向引用的问题。前向引用是对尚未初始化的变量的引用。但是当我们在方法中这样做时,错误的类型会有所不同吗?事实上,我的问题是,当我们用另一个变量初始化方法中的一个变量时,这是否是引用的用法 public static void main(String[] args) { int total=number + 10; int number; 错误是: Exception in thread "main" java.lang.Runt

我是java新手。我有一个关于前向引用的问题。前向引用是对尚未初始化的变量的引用。但是当我们在方法中这样做时,错误的类型会有所不同吗?事实上,我的问题是,当我们用另一个变量初始化方法中的一个变量时,这是否是引用的用法

 public static void main(String[] args) {

        int total=number + 10;
        int number;
错误是:

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - cannot find symbol
  symbol:   variable number
Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - illegal forward reference
没有方法:

class Person 
{

    int total=number + 10;
    int number;
错误是:

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - cannot find symbol
  symbol:   variable number
Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - illegal forward reference

正向引用不适用于局部变量的上下文。适用的是明确的任务。这就是我要说的

对于每次访问局部变量或空白最终字段x,必须在访问之前明确指定x,否则会发生编译时错误

在您的情况下,在int total=number+10访问数字之前,必须明确分配数字,这就解释了为什么会出现编译时错误。

这是关于强调的:

块§14.4中局部变量声明的范围是声明出现的块的其余部分,从其自身的初始值设定项开始,并包括局部变量声明语句右侧的任何其他声明符。 及

在类别C§8.1.6中声明或由类别C§8.1.6继承的成员m声明的范围是整个C主体,包括任何嵌套类型声明。 在第一种情况下,您声明了一个局部变量number,因此您只能在声明之后引用它,但即使这样,您也只能在它被明确赋值后读取它。如果试图在变量声明之前引用该变量,就好像该变量不存在,因此无法找到符号


在第二种情况下,您正在声明一个成员变量,因此您可以在类中的任何位置引用它,包括在声明之前。

您是否看到这个问题:?是的,但我还没有得到我的答案。提供的@marcinj链接肯定是一个很好的回答。你能提供为什么这些答案都对你没有帮助吗?@Ali你在用什么IDE?如果是它的netbeans,则可以看到以下内容:。您的代码应该导致编译错误,而不是运行时错误。同意代码的非法性。但令我好奇的是,他得到的是运行时异常,而不是编译失败。这是某种IDE效应吗?也许它会用会引发运行时异常的东西替换非法代码?@另一个dave:这不可能是运行时异常。这是100%的编译失败,除非OP在运行此代码的应用程序中使用JavaCompiler类。即使如此…仍然是编译失败。OP发布的错误消息称线程“main”中存在RuntimeException。这对我来说似乎很奇怪。我在问题的第一个示例中尝试了精确的代码,得到了一个编译错误:test.java:3:error:not find symbol[…]symbol:variable numbers这是错误的,它不是明确的赋值,它是范围。块§14.4中局部变量声明的范围是声明出现的块的其余部分,从其自身的初始值设定项开始,并包括局部变量声明语句右侧的任何其他声明符。如果表达式名称由单个标识符组成,则必须有一个声明,在标识符出现的点上表示作用域中的局部变量、形式参数或字段。否则,将发生编译时错误。