简体   繁体   English

更改CSS时产生NullPointerException无限流

[英]Infinite stream of NullPointerException when changing CSS

I have an application with multiple controllers and Stages. 我有一个具有多个控制器和舞台的应用程序。 I have tried to implement a switchable theme system via CSS in a parent controller class all my other controllers inherit from. 我试图通过CSS在所有其他控制器继承的父控制器类中实现可切换主题系统。 It works fine, except when I open my Preferences dialog and close it. 除了打开“首选项”对话框并将其关闭之外,它都可以正常工作。 If i try to change themes after that, i get an infinite stream of NullPointerExceptions in the console, and my app stops responding. 如果此后尝试更改主题,则控制台中将收到无限的NullPointerExceptions流,并且我的应用程序停止响应。 It is also important to note that this DOES NOT happen if i run it through IntelliJ, only if I run my jar. 同样重要的是要注意,如果我通过IntelliJ运行它,则只有在运行jar时,它才不会发生。

Lots of relevant code and dumps: 许多相关的代码和转储:

    public class ControllerBase {

  protected static final String LOGGING_CONFIG_FILE_NAME = "/config/logging/log4j.xml";

  public static SimpleStringProperty themeFilename = new SimpleStringProperty(  );

  protected Stage stage;

  protected String cfgFile = new WorkbenchAppConfig().getFileName();
  protected AppPropertiesManager prefs = new AppPropertiesManager();

  protected Logger log;
  protected ResourceBundle res;

  protected ChangeListener CSSListener;

  protected ControllerBase(){


    doInitsFromConfigFile();


    String themeName = prefs.getString( cfgFile, KEY_GUI_THEME_ACTIVE, "Light" );
    themeFilename.set(  prefs.getString( cfgFile, KEY_GUI_THEMES_BASE + "." + themeName + ".filename" ));



    CSSListener = new ChangeListener() {
      @Override
      public void changed( ObservableValue observable, Object oldValue, Object newValue ) {
        updateCss();
      }
    };
    themeFilename.addListener( CSSListener );

  }

  protected void updateCss() {

    //Refresh Theme settings
    if(stage != null) {
      ObservableList< String > css = stage.getScene().getStylesheets();
      css.clear();
      css.add( themeFilename.getValue() );
    }
  }

  protected void doInitsFromConfigFile() {

    // get localized resources
    String localeLanguage = prefs.getString(cfgFile, KEY_APP_LOCALE_LANGUAGE, "en");
    String localeCountry = prefs.getString(cfgFile, KEY_APP_LOCALE_COUNTRY, "US");


    res = CommonGuiUtils.getStringResourceBundle();

    // get active GUI theme
    String themeName = prefs.getString( cfgFile, KEY_GUI_THEME_ACTIVE, "Dark" );
    themeFilename.set(  prefs.getString( cfgFile, KEY_GUI_THEMES_BASE + "." + themeName + ".filename" ));
  }

Methods from my main controller to handle the selection menu: 我的主控制器处理选择菜单的方法:

private void setUpThemeSelection() {

    lightingStyleGroup = new ToggleGroup();
    lightingStyleGroup.getToggles().add( lightThemeOption );
    lightingStyleGroup.getToggles().add( darkThemeOption );

    String themeName = prefs.getString( cfgFile, KEY_GUI_THEME_ACTIVE, "Dark" );
    ObservableList list = lightingStyleGroup.getToggles();

    for ( Object x : list ) {
      if ( ( (RadioMenuItem) x ).getText().startsWith( themeName ) ) {
        lightingStyleGroup.selectToggle( (Toggle) x );
      }
    }
  }

   private void switchTheme( ActionEvent actionEvent ) {

    //Find selected item and change prefs
    RadioMenuItem selected = (RadioMenuItem) lightingStyleGroup.getSelectedToggle();
    prefs.setString( cfgFile, KEY_GUI_THEME_ACTIVE, selected.getText() );

    //Refresh Theme settings
    String themeName = prefs.getString( cfgFile, KEY_GUI_THEME_ACTIVE, "Dark" );
    themeFilename.set(  prefs.getString( cfgFile, KEY_GUI_THEMES_BASE + "." + themeName + ".filename" ));

  }

Dump from console, abridged 从控制台转储,已删除

Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
    at com.sun.javafx.css.StyleManager.lambda$loadStylesheetUnPrivileged$191(StyleManager.java:1060)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.css.StyleManager.loadStylesheetUnPrivileged(StyleManager.java:1054)
    at com.sun.javafx.css.StyleManager.loadStylesheet(StyleManager.java:935)
    at com.sun.javafx.css.StyleManager.processStylesheets(StyleManager.java:1556)
    at com.sun.javafx.css.StyleManager.gatherSceneStylesheets(StyleManager.java:1625)
    at com.sun.javafx.css.StyleManager.findMatchingStyles(StyleManager.java:1663)
    at javafx.scene.CssStyleHelper.createStyleHelper(CssStyleHelper.java:111)
    at javafx.scene.Node.reapplyCss(Node.java:8985)
    at javafx.scene.Node.impl_processCSS(Node.java:9182)
    at javafx.scene.Parent.impl_processCSS(Parent.java:1249)
    at javafx.scene.Node.processCSS(Node.java:9058)
    at javafx.scene.Scene.doCSSPass(Scene.java:545)
    at javafx.scene.Scene.access$3600(Scene.java:159)
    at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2392)
    at com.sun.javafx.tk.Toolkit.lambda$runPulse$30(Toolkit.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:354)
    at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:381)
    at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:510)
    at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:490)
    at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$404(QuantumToolkit.java:319)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
    at java.lang.Thread.run(Thread.java:748)
Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
    at com.sun.javafx.css.StyleManager.lambda$loadStylesheetUnPrivileged$191(StyleManager.java:1060)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.css.StyleManager.loadStylesheetUnPrivileged(StyleManager.java:1054)
    at com.sun.javafx.css.StyleManager.loadStylesheet(StyleManager.java:935)
    at com.sun.javafx.css.StyleManager.processStylesheets(StyleManager.java:1556)
    at com.sun.javafx.css.StyleManager.gatherSceneStylesheets(StyleManager.java:1625)
    at com.sun.javafx.css.StyleManager.findMatchingStyles(StyleManager.java:1663)
    at javafx.scene.CssStyleHelper.createStyleHelper(CssStyleHelper.java:111)
    at javafx.scene.Node.reapplyCss(Node.java:8985)
    at javafx.scene.Node.impl_processCSS(Node.java:9182)
    at javafx.scene.Parent.impl_processCSS(Parent.java:1249)
    at javafx.scene.Node.processCSS(Node.java:9058)
    at javafx.scene.Scene.doCSSPass(Scene.java:545)
    at javafx.scene.Scene.access$3600(Scene.java:159)
    at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2392)
    at com.sun.javafx.tk.Toolkit.lambda$runPulse$30(Toolkit.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:354)
    at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:381)
    at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:510)
    at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:490)
    at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$404(QuantumToolkit.java:319)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
    at java.lang.Thread.run(Thread.java:748)
Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
    at com.sun.javafx.css.StyleManager.lambda$loadStylesheetUnPrivileged$191(StyleManager.java:1060)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.css.StyleManager.loadStylesheetUnPrivileged(StyleManager.java:1054)
    at com.sun.javafx.css.StyleManager.loadStylesheet(StyleManager.java:935)
    at com.sun.javafx.css.StyleManager.processStylesheets(StyleManager.java:1556)
    at com.sun.javafx.css.StyleManager.gatherSceneStylesheets(StyleManager.java:1625)
    at com.sun.javafx.css.StyleManager.findMatchingStyles(StyleManager.java:1663)
    at javafx.scene.CssStyleHelper.createStyleHelper(CssStyleHelper.java:111)
    at javafx.scene.Node.reapplyCss(Node.java:8985)
    at javafx.scene.Node.impl_processCSS(Node.java:9182)
    at javafx.scene.Parent.impl_processCSS(Parent.java:1249)
    at javafx.scene.Node.processCSS(Node.java:9058)
    at javafx.scene.Scene.doCSSPass(Scene.java:545)
    at javafx.scene.Scene.access$3600(Scene.java:159)
    at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2392)
    at com.sun.javafx.tk.Toolkit.lambda$runPulse$30(Toolkit.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:354)
    at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:381)
    at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:510)
    at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:490)
    at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$404(QuantumToolkit.java:319)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
    at java.lang.Thread.run(Thread.java:748)

    ...and so on forever

Does anyone know whats going on? 有人知道发生了什么吗? Whats causing this? 是什么原因造成的?

I found the problem, my preferences manager was returning null sometimes (seemingly randomly) at just the wrong time. 我发现了问题,我的偏好设置管理器有时在错误的时间返回空值(似乎是随机的)。 I have worked around the problem. 我已经解决了这个问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM