Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

Posted

I recently switched over to IntelliJ's IDE and am now getting a warning that I didn't get before about my player Capability potentially being null. Everything has been working in my testing prior to this. No null pointer exceptions when accessing the capability and such. So I'm curious how and when capabilities can actually be null? Clearly it's initially set to null in the provider class.

 

public static final Capability<IThirst> THIRST_CAPABILITY = null;

 

When it's instantiated, IntelliJ tells me it may produce a null pointer exception.

 

private IThirst instance = THIRST_CAPABILITY.getDefaultInstance();

 

Everywhere I use getCapability or getStorage, I get another warning about potential NPEs, for example here:

 

IThirst thirstCapability = player.getCapability(ThirstProvider.THIRST_CAPABILITY, null);

Edited by Daeruin
Marking solved

Well a warning can simply be that -- a warning. It is not necessarily an error. A warning just means you should check to make sure it is really what you want.

 

If you don't want those warnings, it may be a matter of adding the @Nullable annotations appropriately. Or otherwise, maybe setting up the warning preferences in your IDE.

Edited by jabelar

Check out my tutorials here: http://jabelarminecraft.blogspot.com/

Well since that field has no @Holder annotation then you're always gunna have null as nothing ever sets it.

As for when things can be null with the holder annotation, that can happen when the capability is never registered. Which is one of the main points of the capability system to allow you to have soft links to other dependancies.

You should always be checking the Capability<> instances for NULL before using them. You also shouldn't be holding the cap instance in a strongly typed field unless you've already guarded the call it's in with a null check. 

 

 

I do Forge for free, however the servers to run it arn't free, so anything is appreciated.
Consider supporting the team on Patreon

  • Author

I'm relatively new to Java (and coding in general). I tried to read up on the @Holding annotation (couldn't find anything called @Holder) but couldn't figure out how it would help.

 

Indeed my IDE thinks the capability is always null since it's set that way initially in the provider and apparently never changed except during registration, which I guess my IDE doesn't know about. Which makes null checks kind of pointless. In the following example, THIRST_CAPABILITY != null gets highlighted saying the condition is always false. But if I take away the null check, getStorage() gets highlighted saying there's a potential NPE.

 

if (THIRST_CAPABILITY != null)
        return THIRST_CAPABILITY.getStorage().writeNBT(THIRST_CAPABILITY, this.instance, null);

 

I mean, I know I've registered the capability, so I could just suppress the warning. I guess that's what I'll do unless I hear of anything better.

  • Author
4 minutes ago, diesieben07 said:

You have the suppress the warning. Your IDE cannot know that Forge injects something into the field using reflection. If the capability is added by your own mod, you do not need the null check.

As for the "holder annotation", Lex was talking about @CapabilityInject.

 

Thank you, if I had your reply initially I wouldn't have wasted so much time. I spent a long time trying to figure out how @Holder would help anything. My field does have the @CapabilityInject annotation, I just left it out when pasting into my original message.

 

And yes, the capability is being added by my own mod. So I will simply suppress the warnings and forget about the null checks. Thanks!

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

Important Information

By using this site, you agree to our Terms of Use.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.