Java 使用JackAccess检索存储在文本字段中的数值会产生ClassCastException

Java 使用JackAccess检索存储在文本字段中的数值会产生ClassCastException,java,swing,casting,jackcess,Java,Swing,Casting,Jackcess,我正在与Jackcess一起阅读access数据库并对其进行分类。它仅仅意味着打开数据库,循环每一行,并将满足特定条件的单行数据打印到控制台。它工作得很好,除了当我尝试读取数值时。我的代码如下。(此代码内置于Swing GUI中,并在按下jbutton时执行。) if(inv==null){//检查库存文件是否已设置。如果未设置,则将其设置为默认引用路径。 inv=rPath; } if(inventoryFile.exists()){//检查引用路径是否存在。 List testTypes=j

我正在与Jackcess一起阅读access数据库并对其进行分类。它仅仅意味着打开数据库,循环每一行,并将满足特定条件的单行数据打印到控制台。它工作得很好,除了当我尝试读取数值时。我的代码如下。(此代码内置于Swing GUI中,并在按下jbutton时执行。)

if(inv==null){//检查库存文件是否已设置。如果未设置,则将其设置为默认引用路径。
inv=rPath;
}
if(inventoryFile.exists()){//检查引用路径是否存在。
List testTypes=jList1.getSelectedValuesList();
List evalTypes=jList3.getSelectedValuesList();
List grainTypes=jList2.getSelectedValuesList();
StringBuilder sb=新的StringBuilder();

对于(int i=0;i=12.00&&row.getDouble(“CURRENTGAC”)Jackcess不会将所有值作为字符串返回。它将检索表的字段(列)作为该访问字段类型的适当Java类型。例如,使用名为“Table1”的测试表

ID双字段TextField
--  -----------  ---------
1         1.23  4.56     
…下面的Java代码

表t=db.getTable(“表1”);
对于(第r行:t行){
对象o;
双d;
字符串字段名;
fieldName=“DoubleField”;
o=r.get(字段名);
System.out.println(String.format(
“%s返回为:%s”,
字段名,
o、 getClass().getName());
System.out.println(String.format(
“值:%f”,
o) );
System.out.println();
fieldName=“TextField”;
o=r.get(字段名);
System.out.println(String.format(
“%s返回为:%s”,
字段名,
o、 getClass().getName());
System.out.println(String.format(
“值:%s”,
o) );
试一试{
d=r.getDouble(字段名);
}捕获(异常x){
System.out.println(String.format(
“r.getDouble(\“%s\”)失败-%s:%s”,
字段名,
x、 getClass().getName(),
x、 getMessage());
}
试一试{
d=Double.parseDouble(r.getString(fieldName));
System.out.println(String.format(
“Double.parseDouble(r.getString(\“%s\”)成功。值:%f”,
字段名,
d) );
}捕获(异常x){
System.out.println(String.format(
“Double.parseDouble(r.getString(\“%s\”)失败:%s”,
字段名,
x、 getClass().getName());
}
System.out.println();
} 
…产生:

DoubleField返回为:java.lang.Double
价值:1.230000
TextField返回为:java.lang.String
价值:4.56
r、 getDouble(“TextField”)失败-java.lang.ClassCastException:java.lang.String无法转换为java.lang.Double
Double.parseDouble(r.getString(“TextField”))成功。值:4.560000
如果无法从数据库中获取解析字符串值的
Double.parseDouble()
,则

  • 它们包含从您发布的示例中看不出的“有趣字符”,或者
  • 你做错了
关于:您的示例文件的附加信息

JackAccess将CURRENTGAC作为字符串返回,因为它是表中的文本字段:

下面的Java代码

Table t=db.getTable(“NTEP样本列表”);
int countNotNull=0;
int countatlast12=0;
对于(第r行:t行){
字符串s=r.getString(“CURRENTGAC”);
如果(s!=null){
countNotNull++;
Double d=Double.parseDouble(s);
如果(d>=12.00){
至少12++;
}
}
}
System.out.println(String.format(
“扫描完成。找到%d个非空CURRENTGAC值,其中%d个>=12.00。”,
countNotNull,
至少12);
…产生

扫描完成。找到100个非空CURRENTGAC值,其中62个>=12.00。

通过打印
row.get(“CURRENTGAC”).getClass().getName()
并查看它是否显示
java.lang.string
,您可以很容易地看到Jackcess是否真的返回字符串。如果是这样,那么让应用程序打印
string.format(“|%s |”,row.getString(“CURRENTGAC”))
以及您的问题,让我们看看它是什么样子。对于延迟,我深表歉意。我的计算机出现了一些超出此程序范围的安全问题,但现在已得到修复。我的编辑现在已发布。感谢您的帮助。这是我正在使用的数据库的一个示例。我相信我的编码与您的示例类似,但我ould仍然很可能做得不对。这正是发布到这个论坛的要点。如果你能找到任何其他“有趣的字符”,请告诉我你是如何找到这些字符的。@Rucker06当前的GAC字符串值非常好,解析正确。我已经更新了我的答案。
if (inv == null) {                  // Check to see if inventory file has been set.  If not, then set it to the default reference path.
        inv = rPath;                        
}

if (inventoryFile.exists()) {                   // Check to see if the reference path exists.
        List<String> testTypes = jList1.getSelectedValuesList();
        List<String> evalTypes = jList3.getSelectedValuesList();
        List<String> grainTypes = jList2.getSelectedValuesList();

        StringBuilder sb = new StringBuilder();
        for (int i=0; i<=evalTypes.size()-1; i++) {
            if (i<evalTypes.size()-1) {
                sb.append(evalTypes.get(i)).append(" ");
            }
            else {
                sb.append(evalTypes.get(i));
            }
        }
        String evalType = sb.toString();

        try (Database db = DatabaseBuilder.open(new File(inv));) {

            Table sampleList = db.getTable("NTEP SAMPLES LIST");
            Cursor cursor = CursorBuilder.createCursor(sampleList);

            for (int i=0; i<=testTypes.size()-1; i++) {
                if ("Sample Volume".equals(testTypes.get(i))) {
                    if (grainTypes.size() == 1 && "HRW".equals(grainTypes.get(0))) {
                        switch (evalType) {
                            case "GMM":
                                for (Row row : sampleList){                                        
                                    if (null != row.getString("CURRENTGAC")) {}
                                    if ("HRW".equals(row.get("GRAIN")) && row.getDouble("CURRENTGAC")>=12.00) {
                                        System.out.print(row.get("GRAIN") + "\t");
                                        System.out.println(row.get("CURRENTGAC"));
                                    }
                                }                                    
                                break;
                            case "NIRT":
                                // some conditional code
                                break;
                            case "TW":
                                // some more code
                                break;
                         }
                    }
                    else {
                        JOptionPane.showMessageDialog(null, "Only HRW samples can be used for the selected test(s).", "Error", JOptionPane.ERROR_MESSAGE);
                    }                        
                    break;
                }

            }
        }
        catch (IOException ex) {
            Logger.getLogger(SampleFilterGUI.class.getName()).log(Level.SEVERE, null, ex);
        }
case "GMM":
    for (Row row : sampleList){
        if (null != row.get("CURRENTGAC")) 
        //System.out.println(row.get("CURRENTGAC").getClass().getName());
        System.out.println(String.format("|%s|", row.getString("CURRENTGAC")));

        /*if ("HRW".equals(row.get("GRAIN")) && row.getDouble("CURRENTGAC")>=12.00 && row.getDouble("CURRENTGAC")<=14.00) {
             System.out.print(row.get("GRAIN") + "\t");
             System.out.println(row.get("CURRENTGAC"));
        }*/                                        
    }                                    
    break;