在我的Bukkit Java插件中,这是我第一次将代码分离到服务提供商,因此我可以在调试时轻松禁用其中的一部分。
由于某种原因导致出现意外问题,我从已初始化的服务中获得了 NullPointerExceptions ,但它们包含了尚未提供的其他服务的代码。
例如:
worldServiceProvider = new WorldServiceProvider();
clientServiceProvider = new ClientServiceProvider();
menuServiceProvider = new MenuServiceProvider();
statsServiceProvider = new StatsServiceProvider();
commandServiceProvider = new CommandServiceProvider();
battleServiceProvider = new BattleServiceProvider();
serverServiceProvider = new ServerServiceProvider();
该结构总是会导致错误。如何解决初始化问题,或者我应该在设计中做些什么改变?
如果你想查看源代码,这是我的github。
https://github.com/parat26/ares-network/tree/master/src/src/ares/core
答案 0 :(得分:1)
解决方法是使用初始化这些变量的顺序。首先初始化那个不依赖于任何其他的,然后是第二个,依此类推。
NullPointerException意味着该对象直到现在才存在,因此,创建它将最小化此问题,在订单中创建它们。
答案 1 :(得分:0)
你可能有所谓的耦合问题。基本上,两个或更多不应该彼此了解的系统确实相互了解。你现在可以尝试做的最好的事情(希望你没有太大的代码库)是你的提供者解耦,这样他们就不会彼此了解你可以随意禁用它们。
你可以尝试的另一种方法(根据我的经验,这是非常糟糕的编程实践)不是直接访问提供者,而是使用if语句来检查它们是否为空,然后只做你的逻辑。
// instead of this:
float defaultGravity = Providers.physicsProvider.getDefaultGravity();
// do something like this:
float defaultGravity = 9.8f; // some magic default number in case provider is not found
if (Providers.physicsProdiver != null) {
defaultGravity = Providers.physicsProvider.getDefaultGravity();
}
同样,我认为这是非常糟糕的设计,应该仅作为最后的手段使用,并且仅在代码中的少数几个地方使用。您不希望您的代码检查空值,其中值在设计之后不应该为空。
这是一本关于编程模式的免费在线书籍。这很长,但任何没有阅读它的人都可能会学到一些东西。 http://gameprogrammingpatterns.com/contents.html