2016-03-06 24 views
0

我正在创建一个简单的应用程序,并且出于某种原因,我一直在收到空指针异常。我的猜测是,它与我的session.open在if语句中有关系吗? 我得到的错误是在finally块中它说session.close();Hibernate Java中的会话中的空指针异常

import java.util.*; 
import javax.persistence.*; 
import org.hibernate.HibernateException; 
import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.Transaction; 
import org.hibernate.cfg.Configuration; 
import org.hibernate.service.ServiceRegistry; 

public class OrderTester { 
    private static SessionFactory sessionFactory; 
    public static void main(String[] args) { 
     Scanner scan = new Scanner(System.in); 
     Session session = null; 
     Transaction transaction = null; 
     System.out.println("Press 1 to log in or press 2 to sign up"); 
     int n = scan.nextInt(); 

     if (n == 1) { 
      Customer c = new Customer(); 
      // c.logIn(); 
     } else if (n == 2) { 
      try { 
       sessionFactory = HibernateUtil.getSessionFactory(); 
       session = sessionFactory.openSession(); 
       transaction = session.beginTransaction(); 
       Customer c = new Customer(); 
       Address a = new Address(); 
       session.save(c); 
       session.save(a); 

       Scanner read = new Scanner(System.in); 
       System.out.println("Enter a username"); 
       String userName = read.next(); 
       c.setUsername(userName); 

       System.out.println("Enter a password"); 
       String password = read.next(); 
       c.setPassword(password); 

       System.out.println("Enter the street name"); 
       String streetName = read.next(); 
       a.setStreetName(streetName); 

       System.out.println("Enter city"); 
       String city = read.next(); 
       a.setCity(city); 

       System.out.println("Enter state"); 
       String state = read.next(); 
       a.setState(state); 

       System.out.println("Enter zipcode"); 
       String zipcode = read.next(); 
       a.setZipCode(zipcode); 
       read.close(); 

       transaction.commit(); 
      } catch (Exception ex) { 
       transaction.rollback(); 
       System.out.println("Transaction is rolled back."); 
      } finally { 
       session.close(); 
       sessionFactory.close(); 
      } 

     } 

    } 
} 

错误:

Press 1 to log in or press 2 to sign up 
2 
Mar 05, 2016 4:51:44 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit> 
INFO: HCANN000001: Hibernate Commons Annotations {4.0.5.Final} 
Mar 05, 2016 4:51:44 PM org.hibernate.Version logVersion 
INFO: HHH000412: Hibernate Core {4.3.11.Final} 
Mar 05, 2016 4:51:44 PM org.hibernate.cfg.Environment <clinit> 
INFO: HHH000206: hibernate.properties not found 
Mar 05, 2016 4:51:44 PM org.hibernate.cfg.Environment buildBytecodeProvider 
INFO: HHH000021: Bytecode provider name : javassist 
Mar 05, 2016 4:51:44 PM org.hibernate.cfg.Configuration configure 
INFO: HHH000043: Configuring from resource: /hibernate.cfg.xml 
Mar 05, 2016 4:51:44 PM org.hibernate.cfg.Configuration getConfigurationInputStream 
INFO: HHH000040: Configuration resource: /hibernate.cfg.xml 
Mar 05, 2016 4:51:45 PM org.hibernate.internal.util.xml.DTDEntityResolver resolveEntity 
WARN: HHH000223: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/. Use namespace http://www.hibernate.org/dtd/ instead. Refer to Hibernate 3.6 Migration Guide! 
Exception in thread "main" java.lang.NullPointerException 
    at Pizza.OrderTester.main(OrderTester.java:65) 
+0

它显示任何错误信息?你在IDE中运行这个吗?你可以放置断点,看看代码是如何执行的? –

+0

是的,它在session.close()上显示NullPointerException。我也放置了断点,一旦我在控制台上按2,它就会自动引发这些错误。 – StephCurry3093

+0

在行中放置一个断点sessionFactory = HibernateUtil.getSessionFactory();然后进入IDE中的每一行,我有一个怀疑,这条线是抛出异常 –

回答

0

由于两个sessionsessionFactory作为null的try/catch块外面被初始化,永远不要假设他们不会在finally条款是无效和直接调用close()。它更改为以下:

} catch (Exception ex) { 
    if(transaction != null) { 
     try { 
     transaction.rollback(); 
     } catch (Exception e) { // Log error } 
    } 
    ex.printStackTrace(); 
    System.out.println("Transaction is rolled back."); 
} finally { 
    if(session != null) { 
     try { 
     session.close(); 
     } catch (Exception e) { // Log error } 
    } 

    if(sessionFactory != null) { 
     try { 
     sessionFactory.close(); 
     } catch (Exception e) { // Log error } 
    } 
} 
1

与闲来无事的堆栈跟踪的A线NullPointerException只能意味着session为空。据我所知,唯一可能发生的情况是,如果session = sessionFactory.openSession();分配从未执行 - 这意味着sessionFactory.openSession()HibernateUtil.getSessionFactory()中发生了异常,该异常被后面的异常隐藏。 finally区块。

我希望,如果你通过这个代码在调试步骤,你会看到执行流程跳转从这两行的catch块的一个,然后打在transaction.rollback()一个NullPointerException(因为事务分配从未发生过任何)和跳转到finally区块,在那里遇到另一个NullPointerException并退出。