Java 使用JackAccess检索存储在文本字段中的数值会产生ClassCastException
我正在与Jackcess一起阅读access数据库并对其进行分类。它仅仅意味着打开数据库,循环每一行,并将满足特定条件的单行数据打印到控制台。它工作得很好,除了当我尝试读取数值时。我的代码如下。(此代码内置于Swing GUI中,并在按下jbutton时执行。)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
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;