0

I am creating a simple application and for some reason I keep getting null pointer exception. My guess is that it has something to do with my session.open being inside a if statement? The error I am getting is on the finally block where it says session.close();

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();
            }

        }

    }
}

The error:

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)
4
  • is it showing any error message? Are you running this in an IDE? can you place breakpoint and see how the codes are executed? Commented Mar 6, 2016 at 0:45
  • Yes it is showing NullPointerException on session.close(). I placed the breakpoint as well and once I press 2 on the console,it automatically just throws these errors. Commented Mar 6, 2016 at 0:46
  • place a break point in the line sessionFactory = HibernateUtil.getSessionFactory(); and then step into each line in the IDE, i have a doubt this line is throwing the exception Commented Mar 6, 2016 at 0:48
  • @StephCurry3093 Please post your StackTrace it will clear us more to find the bug.. I thinnk Commented Mar 6, 2016 at 0:52

2 Answers 2

1

A NullPointerException on that line with nothing else in the stack trace can only mean that session is null. The only way that could happen, as far as I can tell, is if the session = sessionFactory.openSession(); assignment is never executed - which would mean that an exception is happening either in sessionFactory.openSession() or in HibernateUtil.getSessionFactory(), with that exception being hidden by the later exception raised in the finally block.

I expect that if you step through this code in a debugger you will see the execution flow jump from one of those two lines to the catch block, then hit a NullPointerException on transaction.rollback() (because the transaction assignment never happened either) and jump to the finally block, where it hits another NullPointerException and bails out.

Sign up to request clarification or add additional context in comments.

Comments

0

Since both session and sessionFactory are initialized as null outside the try/catch block, never assume they will not be null in finally clause and call close() directly. Change it to the following:

} 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 }
   }
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.