调用返回相同类型且与类型本身相同名称的变量的静态方法时,“变量 xxx 可能尚未初始化”

2023-12-11

为什么会失败并出现如下所示的错误?我不确定在 JLS 中哪里可以找到执行此类操作的限制。

public class A {

    static A foo() {
        return null;
    }

    public static void main(String[] args) {
        A A = A.foo();
    }
}

编译时出错

A.java:14: error: variable A might not have been initialized
        A A = A.foo();
              ^
1 error

该变量隐藏了同名的类。这就是为什么有的部分原因命名约定.


正如 Patricia 在评论中指出的那样,这实际上在 JLS 中被称为遮蔽:

在这些情况下,规则§6.5指定将优先选择变量而不是类型,并且将优先选择类型而不是包。


在您的情况下,您会收到编译错误,因为变量隐藏了类型,因为声明是在方法调用之前处理的。这与执行以下操作相同:

public class A {
    public void foo() {
        String s = s.substring(0, s.length());
    }
}

你会得到同样类型的错误:



A.java:3: variable s might not have been initialized
        String s = s.substring(0, s.length());
                   ^
1 error
  

在评论中,你说你没有找到JLS说你的建筑违法的地方。它本身并不违法,但由于模糊而导致的结果才是非法的。考虑有 2 个类的情况,由于模糊,您还可能收到不需要的调用,这不是非法的,只是令人困惑:

public class A {
    public void foo() {
        System.out.println("A.foo()");
    }

    public static void main(String[] args) {
        A B = new A();
        B.foo();
    }

    public static class B {
        public static void foo() {
            System.out.println("B.foo()");
        }
    }
}

你认为输出是什么?



$ javac A.java
$ java A
A.foo()
  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

调用返回相同类型且与类型本身相同名称的变量的静态方法时,“变量 xxx 可能尚未初始化” 的相关文章

随机推荐

  • 检测编译后的perl脚本是否动态加载模块

    我正在使用 Strawberry Perl 运行 Windows 10 我用PAR 打包机模块来制作我的一些 Perl 脚本的可执行版本 我发现有些模块例如XML LibXML 需要安装 Perl 才能运行可执行文件 由于我是为没有 Per
  • R范围:在没有本地环境的情况下强制函数中的变量替换

    我在循环中定义函数 并尝试强制评估循环变量 而不必携带私有环境 示例 一组函数handlers h1 handlers h2 handlers h6只是将 1 2 6 传递给另一个函数 如下所示 handlers lt list for i
  • 迭代器的默认值是多少?

    对于我正在使用的任何 STL 容器 如果我使用迭代器的默认构造函数声明一个迭代器 此特定容器类型 则迭代器将被初始化为什么 例如 我有 std list
  • 返回指向静态局部变量的指针安全吗?

    我正在处理一些广泛使用返回指向静态局部变量的指针的习惯用法的代码 例如 char const GetString static char sTest 5 strcpy sTest Test return sTest 我认为这是安全的 对吗
  • 快速删除 Unicode U+2018 左单引号,例如“Ali 到 Ali”

    如何从字符串中删除 Unicode U 2018 左单引号 古拉姆 阿里 阿里 凯尔 阿里 谢尔 阿拉卡达里 我想删除出现的 A 一个 你 字符串中的 u 分别为 A a U u I tried var myString Sozmah Qa
  • pyinstaller 无法执行脚本 pyi rth pkgres

    我有一个用 pyinstaller 制作的 exe 文件 当我尝试运行它时 它给了我这个错误 ModuleNotFoundError 没有名为 pkg resources py2 warn 的模块 50728 无法执行脚本 pyi rth
  • 使用 AIDL 处理跨进程错误的推荐方法 (Android)

    我有一个活页夹服务和一个位于不同进程中的客户端 使用 AIDL 当客户端调用我的远程 Binder 服务时 有时我需要将错误 异常 转发回客户端 然而 根据我的理解 这是不可能的 我尝试从活页夹服务中抛出 RemoteException 看
  • 使用大数组进行反向地理编码是最快的方法吗? - JavaScript 和性能

    我有很多观点Google Maps我想为每个点显示最近的城市 因此是反向地理编码 我有一个像这样的多维数组 citta vicine var comuni Abano Terme PD 45 3594 11 7894 Abbadia Cer
  • NetBeans功能如何关闭

    我已经安装了 NetBeans 15 他们默认打开了一个功能 我觉得这个功能非常分散注意力 我该如何关闭它 它是下图中突出显示的代码 这是不可编辑的额外文本 对我来说只是妨碍 先感谢您 感谢一位同事找到了答案 关闭下面的 显示内联提示
  • R 中不同颜色组合的堆积条形图

    我需要从表单的数据创建一个堆积条形图c a b a 和 b 由 c 标准化 使得 a 和 b 加起来为 1 我拥有的数据需要特定的格式 因此 a 和 b 需要是列表 下面是给定这些特定格式的最简单的可重现示例 A list 2 1 1 2
  • 是否需要构建 boost.signals2 库?

    我的系统在构建 boost 库时遇到问题 我知道大多数 boost 库 幸运的是 只是不需要构建的标头 有一些例外 是否需要构建 boost signals2 库 boost signals2 库也依赖于 boost signals 库吗
  • 使用 C 解析 URL 的最佳方法?

    我有一个像这样的网址 http 192 168 0 1 8080 servlet rece 我想解析 URL 来获取值 IP 192 168 0 1 Port 8080 page servlet rece 我怎么做 就我个人而言 我偷了HT
  • 除了在每次闭包之前克隆它之外,还有其他选择在多个闭包中共享 Arc 吗?

    我有这样的事情 use std sync Arc fn main let arc Arc new 42 move arc clone move arc clone 我正进入 状态 error E0382 capture of moved v
  • 如何实现标签系统

    我想知道实现标签系统的最佳方法是什么 就像 SO 上使用的那样 我正在考虑这个问题 但我无法想出一个好的可扩展解决方案 我正在考虑有一个基本的 3 表解决方案 有一个tags桌子 一个articles桌子和一个tag to articles
  • number_in_month 练习(SML 中多个列表的迭代)

    我在 SML 中有两个列表 假设列表 A a b c d e f 和列表B b e 我想计算 B 中每个项目与 A 中每个三元组的第二个元素匹配的次数 输出应该是 2 因为b and e每个在 A 中出现一次 到目前为止 这是我的代码 但是
  • Blogger 主题的下一个和上一个按钮

    这可能需要花费很多时间 并且可能是一个很难回答的问题 但请帮忙 我有一个博主博客 这是一个阅读日本漫画的博客 这个博客的主题实际上是在未完全开发的情况下发布的 我下载并应用了它 尽管我几乎完成了必要的地方的编码 但仍然遗漏了一些问题 其中一
  • 如何在不使用数据透视的情况下在 SQL 中将行转换或转置为列?

    我在 SQL 中转置数据时遇到一个问题 例如下面给出的表格 id source name value 1 cp x 1 cp y 1 hi a 2 li b 2 cp c 2 li d 3 li e 我需要以下格式的表格 转置但带有字符串聚
  • 通过 XML 文件*和*代码配置 log4net 附加程序

    我今天开始使用 log4net 到目前为止 我真的很喜欢它 为了保留我们当前的日志记录功能 应用程序需要在应用程序启动时创建一个新的日志文件 日志文件名中包含编码的日期和时间戳 目前 我已经通过以下方式配置了 log4netXmlConfi
  • 带大括号的正则表达式

    我有以下字符串 blabla blabla xyzxyz blabla 什么是正确的正则表达式匹配模式来分隔大括号中的内容并将其放入数组中 我正在使用 RegExKitLite 和 Objective C 我将非常感谢你的帮助 好的 我刚刚
  • 调用返回相同类型且与类型本身相同名称的变量的静态方法时,“变量 xxx 可能尚未初始化”

    为什么会失败并出现如下所示的错误 我不确定在 JLS 中哪里可以找到执行此类操作的限制 public class A static A foo return null public static void main String args