DreamVoid
本帖最后由 DreamVoid 于 2021-7-22 20:09 编辑

已解决
最后我实在没有办法,全部弄成static了


  1. package me.dreamvoid.miraimc.internal;

  2. import me.dreamvoid.miraimc.bukkit.BukkitPlugin;
  3. import me.dreamvoid.miraimc.bungee.BungeePlugin;

  4. import java.util.logging.Logger;

  5. public class Utils {
  6.     private final Logger Logger;
  7.     private static Utils Instance;

  8.     public Utils(BukkitPlugin plugin){
  9.         Logger = plugin.getLogger();
  10.         Instance = this;
  11.     }
  12.     public Utils(BungeePlugin bungee){
  13.         Logger = bungee.getLogger();
  14.         Instance = this;
  15.     }

  16.     public static Logger getLogger() {
  17.         return Utils.Instance.Logger;
  18.     }
  19. }
复制代码

以上写法,编译时没有问题,而在使用的时候就会出现
  1. [18:33:17 ERROR]: [org.bukkit.craftbukkit.v1_17_R1.CraftServer] Cannot read field "Logger" because "me.dreamvoid.miraimc.internal.Utils.Instance" is null initializing MiraiMC v1.2 (Is it up to date?)
  2. java.lang.NullPointerException: Cannot read field "Logger" because "me.dreamvoid.miraimc.internal.Utils.Instance" is null
  3.         at me.dreamvoid.miraimc.internal.Utils.getLogger(Utils.java:24) ~[?:?]
  4.         at me.dreamvoid.miraimc.internal.Config.<init>(Config.java:39) ~[?:?]
  5.         at me.dreamvoid.miraimc.bukkit.BukkitPlugin.onLoad(BukkitPlugin.java:23) ~[?:?]
复制代码

想知道为什么这样写是有问题的,及正确的写法应该是怎样的

结冰的离季
本帖最后由 结冰的离季 于 2021-7-22 20:16 编辑

不建议在构造方法里使用this赋值

用户2588899
本来就该弄成static啊。。

1310784365
已解决个鬼

static方法在调用时会绕过构造方法,Instance根本没有被赋值
还有推荐在用到logger的每个类都分别获取一次logger,可以更方便地找到有问题的类

byxiaobai
强烈建议使用:public static final xxUtil INSTANCE=new xxUtil();

byxiaobai
另外,变量的命名规范属于java基础知识

DreamVoid
本帖最后由 DreamVoid 于 2021-7-22 22:20 编辑
1310784365 发表于 2021-7-22 20:34
已解决个鬼

static方法在调用时会绕过构造方法,Instance根本没有被赋值

其实我根本不需要用到Instance,甚至Utils也没必要加,用这个只是为了调用更方便
这是我改好以后的代码,要输出日志了直接Utils.Logger
  1. package me.dreamvoid.miraimc.internal;

  2. import me.dreamvoid.miraimc.bukkit.BukkitPlugin;
  3. import me.dreamvoid.miraimc.bungee.BungeePlugin;

  4. import java.util.logging.Logger;

  5. public class Utils {
  6.     public static Logger Logger;

  7.     public Utils(BukkitPlugin plugin){
  8.         Logger = plugin.getLogger();
  9.     }
  10.     public Utils(BungeePlugin bungee){
  11.         Logger = bungee.getLogger();
  12.     }
  13. }
复制代码

Sky_God_
byxiaobai 发表于 2021-7-22 21:19
另外,变量的命名规范属于java基础知识

其实,java 命名的规范,基本上遵守的是驼峰命名。
其中,楼主所使用的是大驼峰法,我们和大部分的人用的是小驼峰。具体解释如下:

byxiaobai
Sky_God_ 发表于 2021-7-23 08:36
其实,java 命名的规范,基本上遵守的是驼峰命名。
其中,楼主所使用的是大驼峰法,我们和大部分的人用的 ...

大驼峰能用来声明局部变量?丑的要命

Sky_God_
byxiaobai 发表于 2021-7-23 13:27
大驼峰能用来声明局部变量?丑的要命

那只是有这样的规则,但是我也觉得很丑,主要是个人的观感不一样

DreamVoid
本帖最后由 DreamVoid 于 2021-7-25 15:13 编辑
byxiaobai 发表于 2021-7-23 13:27
大驼峰能用来声明局部变量?丑的要命

所以你会发现我给开发者调用的方法都是小驼峰法,这些插件内部调用我自己看着就行

第一页 上一页 下一页 最后一页