Java 如何通过RapidClipse自动生成代码修复空指针验证

Java 如何通过RapidClipse自动生成代码修复空指针验证,java,vaadin,rapidclipse,Java,Vaadin,Rapidclipse,使用RapidClipse,我构建了一个包含三个元素的页面下拉字段、XdevTable和XDevfieldGroup。 下拉字段由数据库表内容填充(工作正常) 从下拉字段中选择一个值后,应填写该表(工作正常) 从XDevTable中选择一个值后,字段组应可编辑相关行。 在表中选择一行后,我得到一个空指针: 2019年5月27日下午4:41:19 com.vaadin.server.DefaultErrorHandler doDefault SCHWERWIEGEND: java.lang.Nu

使用RapidClipse,我构建了一个包含三个元素的页面
下拉字段、XdevTable和XDevfieldGroup。
下拉字段由数据库表内容填充(工作正常)
从下拉字段中选择一个值后,应填写该表(工作正常)
从XDevTable中选择一个值后,字段组应可编辑相关行。

在表中选择一行后,我得到一个空指针:

2019年5月27日下午4:41:19 com.vaadin.server.DefaultErrorHandler doDefault
SCHWERWIEGEND:
java.lang.NullPointerException
在
com.xdev.ui.entitycomponent.table.AbstractBeanTable.getSelectedItem(AbstractBeanTable.java:180)
位于com.xdev.ui.masterdetail.FieldGroupMasterDetailConnection.lambda$0(FieldGroupMasterDetailConnection.java:64)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(未知源)
在sun.reflect.DelegatingMethodAccessorImpl.invoke处(未知源)
位于java.lang.reflect.Method.invoke(未知源)
位于com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:510)
在com.vaadin.event.EventRouter.firevent(EventRouter.java:200)上
在com.vaadin.event.EventRouter.firevent(EventRouter.java:163)上
位于com.vaadin.server.AbstractClientConnector.fireEvent(AbstractClientConnector.java:1015)
位于com.vaadin.ui.AbstractField.fireValueChange(AbstractField.java:1161)
在com.vaadin.ui.AbstractField.setValue(AbstractField.java:571)上
位于com.vaadin.ui.AbstractSelect.setValue(AbstractSelect.java:735)
在com.vaadin.ui.AbstractField.setValue(AbstractField.java:468)上
在com.vaadin.ui.AbstractSelect.changeVariables上(AbstractSelect.java:547)
位于com.vaadin.ui.Table.changeVariables(Table.java:2933)
在com.vaadin.server.communication.ServerRpcHandler.changeVariables上(ServerRpcHandler.java:616)
位于com.vaadin.server.communication.ServerRpcHandler.handleInvocation(ServerRpcHandler.java:463)
位于com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:406)
位于com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:273)
位于com.vaadin.server.communication.UidlRequestHandler.synchronizedHandlerRequest(UidlRequestHandler.java:90)
位于com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41)
位于com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1435)
位于com.vaadin.server.VaadinServlet.service(VaadinServlet.java:380)
位于com.xdev.communication.XdevServlet.service(XdevServlet.java:212)
位于javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
位于org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
位于org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
位于org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
位于org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
位于org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
位于org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
位于org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
位于org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
位于org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:660)
位于org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
位于org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
位于org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:798)
位于org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
位于org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:808)
位于org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
位于org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(未知源)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(未知源)
位于org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
位于java.lang.Thread.run(未知源)
如果我是对的,我假设存在一个泄漏,标识表中所选的项目
但我仍然做了RapidClipse培训中描述的事情
因此,表和字段组之间的连接是通过表内的属性“ConnectedForm”完成的。

从下拉字段到表的连接通过以下代码完成:

private void comboBox_valueChange(final Property.ValueChangeEvent event) {

    try {

        Integer varMainClass = 0;
        varMainClass = this.comboBox.getSelectedItem().getBean().getId();

        Notification.show("Kuck a mole: ", this.comboBox.getSelectedItem().getBean().getGroupName()
                , Notification.Type.ERROR_MESSAGE);

        final BeanItemContainer<TGroup> mySubClasses = new BeanItemContainer<>(TGroup.class);
        mySubClasses.addAll(new TGroupDAO().getAllSubClassByMainClassId(varMainClass));
        this.table.setContainerDataSource(mySubClasses);
        this.table.setVisibleColumns("id", "groupName");
        this.table.setVisible(true);
    } catch (final Exception e) {
        e.printStackTrace();
        final String stackTrace = Throwables.getStackTraceAsString(e);
        this.textAreaErr.setValue(stackTrace);
        this.textAreaErr.setVisible(true);
        Notification.show("Do isch was falsch, Nachricht: ", e.getMessage(), Notification.Type.ERROR_MESSAGE);

    }

}

我很高兴,因为我在朋友的帮助下找到了解决办法!

这仍然是我的错(正如所料:-)。我使用了错误的容器类型:
我使用:

            final BeanItemContainer<TGroup> mySubClasses = new BeanItemContainer<>(TGroup.class);
final BeanItemContainer mySubClasses=新的BeanItemContainer(TGroup.class);
但它是错误的容器
我应该改用:

final XdevBeanItemContainer<TGroup> mySubClasses = new XdevBeanItemContainer<>(TGroup.class);
final XdevBeanItemContainer mySubClasses=新的XdevBeanItemContainer(TGroup.class);
我换了之后,一切都很好。

我还在文档中搜索了一个提示,我如何在将来防止这种情况发生,但没有成功。

谢谢保罗的提示。事件“table_valueChange”仍未激发。该错误通过以下函数出现在“AbstractBeanTable.class”中:
public BeanItem getSelectedItem(){if(!this.isMultiSelect()){返回this.getBeanContainerDataSource().getItem(this.getValue());}返回null;}
问题是
getSelectedItem
抛出异常,因为它得到的是null值,函数不接受该值。你可以把它放在一个
try…catch
块中,一个
            final BeanItemContainer<TGroup> mySubClasses = new BeanItemContainer<>(TGroup.class);
final XdevBeanItemContainer<TGroup> mySubClasses = new XdevBeanItemContainer<>(TGroup.class);