【发布时间】:2012-10-29 04:27:41
【问题描述】:
我们尝试使用 Guice 重构项目。这个想法是将所有 Language 接口绑定到一个 concreate 对象,例如 French 或 Polish。
我们有一个绑定模块:
public class StandardModule extends AbstractModule {
@Override
protected void configure() {
bind(Language.class).to(Polish.class);
}
}
还有一个使用这个注入对象的类(AboutDialog.java):
@Inject Language language;
public AboutDialog(JFrame parent) {
super(parent, "", true);
this.language=language;
this.setTitle(language.getLanguageInUse().getString("AboutDialog.title"));
this.parent = parent;
try {
jbInit();
} catch (Exception e) {
e.printStackTrace();
}
pack();
}
我们得到了结果:
java.lang.NullPointerException at net.sf.jmoney.gui.AboutDialog.<init>(AboutDialog.java:67)
第 67 行是:
this.setTitle(language.getLanguageInUse().getString("AboutDialog.title"));
我们的界面是:
public interface Language {
public ResourceBundle getLanguageInUse();
}
波兰语课是:
public class Polish implements Language {
private ResourceBundle languageInUse;
public Polish() {
languageInUse = ResourceBundle.getBundle(Constants.LANGUAGE_PL);
}
public ResourceBundle getLanguageInUse() {
return languageInUse;
}
}
我们迷路了……
【问题讨论】:
-
你应该稍微改变你的代码,看看 NPE 是在哪里抛出的。
code ResourceBundle bundle = language.getLanguageInUse(); String label = bundle.getString("AboutDialog.title"); -
空对象是语言。我们认为注入不起作用。
-
如何创建 AboutDialog?我不认为您正在使用 Guice 创建对话框,因为 Guice 需要一个空的构造函数,或者您是否将 jframe 绑定到某个地方?
-
尝试在波兰类的构造函数中使用 log/System.out 指令打印当前线程堆栈跟踪。这样就可以看出是不是Guice框架构建的了。是 this.language=language;真的需要指导吗?
-
ResourceBundle 可以加载本地特定的属性,无需将其包装在语言类中:docs.oracle.com/javase/tutorial/i18n/resbundle/concept.html
标签: java nullpointerexception guice code-injection