gpt4 book ai didi

java - 使用十六进制值作为方法的参数时出现 NullPointerException

转载 作者:行者123 更新时间:2023-12-01 09:46:34 27 4
gpt4 key购买 nike

我正在编写一个简单的程序,其中包含一个窗口,其中有 8 个按钮,这些按钮的颜色不同,添加到 VBox 中。然后将其添加到程序阶段的场景中。

要更改按钮的颜色,我必须调用 setRippleColor()方法,其定义如下:

public void setRippleColor(Color color) {
((Shape) ((SkinBase) getSkin()).getChildren().get(0)).setFill(color);
}

问题是,当我使用 Color 调用此方法时对象作为其参数,我得到 NullPointerException .

例如,如果我使用此代码:

        buttonGreen.setRippleColor((Color.web("0x259B24")));
buttonOrange.setRippleColor(Color.web("0xe67e22"));
buttonBlue.setRippleColor(Color.web("0x3498db"));
buttonPurple.setRippleColor(Color.web("0x9b59b6"));
buttonYellow.setRippleColor(Color.web("0xf1c40f"));
buttonRed.setRippleColor(Color.web("0xe74c3c"));
buttonBrown.setRippleColor(Color.web("0x663300"));
buttonGrey.setRippleColor(Color.web("0x222222"));

VBox verticalLayout = new VBox(8);
verticalLayout.getChildren().addAll(buttonGreen,
buttonOrange,
buttonBlue,
buttonPurple,
buttonYellow,
buttonRed,
buttonBrown,
buttonGrey);

控制台会这样说:

 Exception in Application start method
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(Unknown Source)
at com.sun.javafx.application.LauncherImpl.launchApplication(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(Unknown Source)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
at CustomButton.setRippleColor(CustomButton.java:166)
at StartingPoint.start(StartingPoint.java:25)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(Unknown Source)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(Unknown Source)
at com.sun.javafx.application.PlatformImpl.lambda$null$173(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(Unknown Source)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(Unknown Source)

第 166 行和第 25 行代码分别是方法的定义和第一次调用。

尽管如此,如果我不使用十六进制值作为颜色,而是使用 Color 的默认颜色之一类(例如 Color.GREEN ),一切运行完美。

值得一提的是,我没有使用 java.awt.Color类而不是 javafx.scene.paint.Color ;图书馆没有问题。

更新:我做了一些基本的日志记录,以便了解 null 是什么。 .

而不是使用 Color.web("...")作为 setRippleColor() 的参数,我创建了几个Color其定义一开始就是 setRippleColor() 的对象的参数,我包围了对 setRippleMethod() 的调用具有以下try{} catch{} :

Color green = Color.web("0x259B24");

try {
buttonGreen.setRippleColor(green);
} catch (NullPointerException exception) {

SkinBase skin = (SkinBase) buttonGreen.getSkin();
ObservableList<Node> children = skin.getChildren();
Shape shape = (Shape) skin.getChildren().get(0);

System.out.println("Color " + green);
System.out.println("Skin: " + skin);
System.out.println("Children: " + children);
System.out.println("Shape: " + shape);

}

这是控制台打印出来的内容:

Exception in Application start method
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(Unknown Source)
at com.sun.javafx.application.LauncherImpl.launchApplication(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(Unknown Source)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
at StartingPoint.start(StartingPoint.java:31)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(Unknown Source)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(Unknown Source)
at com.sun.javafx.application.PlatformImpl.lambda$null$173(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(Unknown Source)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(Unknown Source)

据我了解,这意味着按钮的皮肤的子级返回 null ,但我不明白为什么当我使用 Color.GREEN 时不会发生这种情况而不是 Color在上面的代码中找到的对象。

更新2:事实证明,当我使用Color.GREEN时作为 setRippleColor() 的参数结果与我使用 Color.web("#colorstring") 相同,这是显而易见的事情,如果不是这样的话,就不会有解释。我不知道为什么,但我有使用Color.GREEN的内存并使程序运行没有任何错误。

好消息是,现在我会记住,每当某些事情没有意义时,我必须再次运行代码并确保它对我来说没有意义,因为我没有足够的知识关于这个主题,而不是因为它从未发生过。

所以,问题是由于按钮的皮肤在 setRippleColor() 之前尚未初始化。方法被调用。

我是这样解决的:

try{
((Shape) ((SkinBase) getSkin()).getChildren().get(0)).setFill(color);
} catch (NullPointerException exception){
createDefaultSkin();
setRippleColor(color);
}

如果调用方法时皮肤尚未初始化,则先初始化皮肤,然后setRippleColor()又给自己打电话了。

最佳答案

最可能的原因是您试图在皮肤初始化之前调用这些方法。在这种情况下,getSkin() 将返回 null,因此 ((SkinBase)getSkin()).getChildren() 将抛出空指针异常。

避免这种情况的一个简单方法是进行空检查:

public void setRippleColor(Color color) {
if (getSkin() == null) {
createDefaultSkin();
}
SkinBase skin = (SkinBase) getSkin();
Shape shape = (Shape) skin.getChildren().get(0);
shape.setFill(color);
}

您可能可以极大地改进这段代码:看来您应该真正知道代码中的某个地方皮肤的第一个子项是什么,并且应该能够直接引用它。不过,这至少会提供修复。

关于java - 使用十六进制值作为方法的参数时出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37955741/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com