我有一个General类,它有静态方法和静态变量,Hibernate配置设置和方法在命中数据库后返回List。我正在研究JavaFx,我最近学会了更好地使用Task进行耗时的操作,例如点击数据库获取一长串数据等。 所以,在我的情况下,我创建了一个Task对象,在匿名内部类中编写代码,其中包含用于访问LOGIN凭据的db的代码。 Task必须返回List的实例。 我在静态方法中初始化了一个Thread对象,在其构造函数中传递了Task对象,将守护进程设置为true并启动了Thread。但是我在运行应用程序后得到NullPointerException。
private static SessionFactory sessionFactory = null;
private static Session session = null;
private static final Transaction transaction = null;
private static final Configuration configuration = null;
private static List list;
public static List getSelectList(final String query)
{
//list = null;
System.err.println("Inside getSelectList");
try{
final Task <List> task= new Task <List> ()
{
@Override
public List call()
{
try
{
System.err.println("Inside call");
session.beginTransaction();
list = session.createQuery(query).list();
System.err.println(list);
session.getTransaction().commit();
return list;
}
catch (Exception e)
{
session.getTransaction().rollback();
e.printStackTrace();
}
System.err.println("Outta try block");
return null;
}
};
task.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent t) {
System.err.println("Inside handle");
list = task.getValue();
/* for (Iterator it = list.iterator();it.hasNext(); )
{
System.err.println("Inside Set on succeeded");
//System.err.println( ((Login)it.next()).getUsername());
} */
}
});
Thread th = new Thread(task);
th.setDaemon(true);
th.start();
//list=task.getValue();
}
catch (Exception e) {e.printStackTrace();}
return list;
}
但是,在经过多次组合和随机排列之后,对于我来说,通过评论线程代码而不是用task.run()代替它是有用的。
/*Thread th = new Thread(task);
th.setDaemon(true);
th.start();*/
task.run();
另外我不得不改变局部变量List list = session.createQuery(query).list();通过声明静态列表列表;并初始化此静态列表= session.createQuery(query).list();因为即使我删除了线程代码并添加了task.run()
,它也会抛出异常 try
{
session.beginTransaction();
//List locallist = session.createSQLQuery(query).list();
list = session.createSQLQuery(query).list();
session.getTransaction().commit();
return list ;
}
catch (Exception e){
session.getTransaction().rollback();
我想知道为什么会这样。为什么task.run()和静态List一起为我工作?
将List转换为static并删除Thread实例并使用task.run();仅仅是为了让我的代码能够工作而从我这边尝试不同的数字。我不知道原因。 任何解释都会让我感到非常谦卑。提前谢谢。