我正在调查一个奇怪的情况,即JavaFX的SimpleIntegerProperty不时会返回正确的值。我已经google了很多,但没有发现任何关于这个问题的暗示。我知道这些属性不是线程安全的,但在这种情况下,同一个线程正在执行set()和get()方法,这些方法可以在下面的代码中看到。
有一个模型类"客户"其中SimpleIntegerProperty是一个成员变量:
public class Customer {
private SimpleIntegerProperty adr_nr = new SimpleIntegerProperty();
private void queryDataFromDatabase(int adr_nr, Connection connection) throws AdrNrNotFoundException{
Connection con = connection;
Statement stmt = null;
ResultSet rs = null;
String sadr_nr = String.valueOf(adr_nr);
try{
String sqlgrunddat = "select adr_nr, adr_name1, adr_name2"
+ " from customer"
+ " where adr_nr="+sadr_nr;
stmt = con.createStatement();
rs = stmt.executeQuery(sqlgrunddat);
while(rs.next()){
this.adr_nr.set(rs.getInt(1));
}
rs.close();
stmt.close();
if (this.adr_nr.get()<1){
throw new AdrNrNotFoundException();
}
}
catch (SQLException e){
e.printStackTrace();
}
}
}
间歇性发生的问题是,尽管AdrNrNotFoundException
返回了正确的整数值并且之前已成功设置了属性,但ResultSet
被抛出。因此,当我在抛出异常之前设置断点时,我可以看到我的SimpleIntegerProperty adr_nr具有正确的值(例如20532)。
看起来adr_nr.get()
方法间歇性地返回0 - 否则if将返回false。正如我所说,线程安全的问题在这种情况下不应该是问题,因为属性的set()
和get()
方法是在同一个线程上运行的同一个方法中调用的。
从
更改代码 if (this.adr_nr.get()<1){
throw new AdrNrNotFoundException();
}
到
if (this.adr_nr.get()==0){
throw new AdrNrNotFoundException();
}
并没有改变这种情况。
如果我使用原始int
作为解决方法,则问题不会发生。我正在使用JDK 8更新121.
希望有人有想法......
提前致谢!