我正在构建一个简单的计算器,我想使用经过验证的计算器 WolframAlpha 来验证我的计算,但我遇到了一些一致性问题。我正在对此进行编程以了解有关 Android、Java 和 XML 的更多信息。大部分代码直接取自 WolframAlphaSample.java 文件并简化为仅返回我们需要的“pod”(信息)。
在我的 ActivityMain.java 中,我将函数传递给我的 editText:
Double wolframAnswer = WolframAlpha.queryInput(editLine.getText().toString());
在 WolframAlpha.queryInput() 我的代码看起来像:
public static double queryInput(String input)
{
WAEngine engine = new WAEngine();
System.out.println("Wolfram Input: " + input);
// These properties will be set in all the WAQuery objects created from this WAEngine.
engine.setAppID(appid);
engine.addFormat("plaintext");
engine.addIncludePodID("DecimalApproximation");
engine.addIncludePodID("Result");
WAQuery query = engine.createQuery(); // Create the query.
query.setInput(input); // Sets property of the query.
double finalResult = 0.0;
try {
// This sends the URL to the Wolfram|Alpha server, gets the XML result
// and parses it into an object hierarchy held by the WAQueryResult object.
WAQueryResult queryResult = engine.performQuery(query);
//System.out.println(((WAPlainText)(queryResult.getPods()[0].getSubpods()[0].getContents()[0])).getText());
String unroundedResult;
if (queryResult.isError())
{
return 1.0; // error
}
else if (!queryResult.isSuccess())
{
return 2.0; // misunderstood
}
else if(queryResult.getPods().length == 1)
{
unroundedResult = ((WAPlainText)(queryResult.getPods()[0].getSubpods()[0].getContents()[0])).getText();
if (unroundedResult.endsWith("...")) // Remove trailing dots if really long number
{
unroundedResult = unroundedResult.replaceAll("\\.\\.\\.", "");
}
}
else
{
unroundedResult = ((WAPlainText)(queryResult.getPods()[1].getSubpods()[0].getContents()[0])).getText();
}
finalResult = Double.parseDouble(unroundedResult);
} catch (WAException e) {
e.printStackTrace();
}
return finalResult;
}
}
当我们从 WolframAlpha.java 中的控制台使用简单查询 (5+8) 运行它时,它工作正常,如果我们从传递完全相同数据的 Android 应用程序运行它,它会捕获并抛出异常。知道为什么我们会看到两种不同的行为吗?
小提示:返回 1.0 和 2.0 不是最好的主意,但被扔进去了,因为我不确定如何返回不是双精度的错误,我想调试发生了什么,结果证明它不是无论如何,我不会走那条路,但我把它留在这里。