gpt4 book ai didi

java - List 不为空,但不能在没有空指针异常的情况下调用 .isEmpty
转载 作者:塔克拉玛干 更新时间:2023-11-02 07:45:46 27 4
gpt4 key购买 nike

    Laerer laerer = (Laerer) session.getAttribute("laererInnlogget");
List<Spoerreskjema> ss = laerer.getSkjemaliste();

if(ss == null)
System.out.println("1");
if(ss != null)
System.out.println("2");
if(ss.isEmpty())
System.out.println("3");
if(!ss.isEmpty())
System.out.println("4");

if 循环用于显示问题所在。

控制台将显示 2,然后在到达 ss.isEmpty() 时抛出 NullPointerException

laerer 对象不为空,但包含一个应该为空(或至少为空)的列表

所有这些都存储在/从 postgresql 数据库中获取。

知道问题出在哪里吗?

顺便说一句,调用 ss.size() 也会导致 NullPointerException

我基本上希望能够检查列表是否为空。

SEVERE: Servlet.service() for servlet [no.hib.prosjekt01.controllers.laerer.LaererHjemServlet] in context with path [/prosjekt01] threw exception
java.lang.NullPointerException
at org.apache.openjpa.enhance.no$hib$prosjekt01$models$Laerer$pcsubclass.pcReplaceField(Unknown Source)
at org.apache.openjpa.kernel.StateManagerImpl.replaceField(StateManagerImpl.java:3254)
at org.apache.openjpa.kernel.StateManagerImpl.storeObjectField(StateManagerImpl.java:2681)
at org.apache.openjpa.kernel.StateManagerImpl.storeObject(StateManagerImpl.java:2671)
at org.apache.openjpa.jdbc.meta.strats.StoreCollectionFieldStrategy.load(StoreCollectionFieldStrategy.java:596)
at org.apache.openjpa.jdbc.meta.FieldMapping.load(FieldMapping.java:934)
at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.load(JDBCStoreManager.java:681)
at org.apache.openjpa.kernel.DelegatingStoreManager.load(DelegatingStoreManager.java:117)
at org.apache.openjpa.kernel.ROPStoreManager.load(ROPStoreManager.java:78)
at org.apache.openjpa.kernel.StateManagerImpl.loadFields(StateManagerImpl.java:3146)
at org.apache.openjpa.kernel.StateManagerImpl.loadField(StateManagerImpl.java:3226)
at org.apache.openjpa.kernel.StateManagerImpl.fetchObjectField(StateManagerImpl.java:2468)
at org.apache.openjpa.kernel.StateManagerImpl.fetchField(StateManagerImpl.java:890)
at org.apache.openjpa.kernel.StateManagerImpl.fetch(StateManagerImpl.java:852)
at org.apache.openjpa.enhance.RedefinitionHelper$1.invoke(RedefinitionHelper.java:230)
at com.sun.proxy.$Proxy68.isEmpty(Unknown Source)
at no.hib.prosjekt01.controllers.laerer.LaererHjemServlet.doGet(LaererHjemServlet.java:35)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:44)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)

编辑1:

Creating subclass for "[class no.hib.prosjekt01.models.Spoerreskjema, class no.hib.prosjekt01.models.Laerer, class no.hib.prosjekt01.models.Svar, class no.hib.prosjekt01.models.Spoersmaal, class no.hib.prosjekt01.models.Kryptering]". This means that your application will be less efficient and will consume more memory than it would if you ran the OpenJPA enhancer. Additionally, lazy loading will not be available for one-to-one and many-to-one persistent attributes in types using field access; they will be loaded eagerly instead.

编辑2:

@Entity
@Table(name = "laerer")
public class Laerer implements Serializable {
private static final long serialVersionUID = 1L;

@Id
private String id;
private String fornavn;
private String etternavn;
@Lob
private byte[] passord;

@OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "laerer")
private List<Spoerreskjema> skjemaliste;



public Laerer(String epost, String fornavn, String etternavn, byte[] passord) {
this.id = epost;
this.fornavn = fornavn;
this.etternavn = etternavn;
this.passord = passord;
this.skjemaliste = new ArrayList<Spoerreskjema>();
}

public Laerer() {
id = null;
fornavn = null;
etternavn = null;
passord = null;
skjemaliste = null;
}

最佳答案

好的,现在我有了它。您正在加载 Laerer 对象,然后将其放入 session 中。稍后您尝试访问其上的延迟加载集合。但问题是,列表中的代理应该调用您的数据库以获取数据,它需要与加载 Laerer 时对数据库的调用处于同一事务中。

有几种解决方案。

  1. 当您知道该列表中没有那么多对象时,您会很高兴地更改为“EAGER”。

  2. 在您从 entitymanager 获得 Laerer 对象后,在您的 DAO 中调用列表来加载它。与直接“EAGER”加载它相同。 (JPA定义一个实体只能有一个EAGER Loaded列表)

  3. 不要直接加载列表。而是在加载 Laerer 对象时加载 ID 列表。然后,当您通过 session 访问 ID 列表时,您可以再次调用数据库以按 ID 加载所需的对象。例如,您可以将 ID 列表作为逗号分隔的字符串放置在实体的 transient 变量中。该字符串可以直接用于 SELECT a FROM a.class WHERE a.id IN (:IDS) 查询。

关于java - List<Object> 不为空,但不能在没有空指针异常的情况下调用 .isEmpty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26841806/

27 4 0