如何使用Java开发工具(JDT)检查类型范围?
我想使用JDT解析一个包含数字的字符串,以确定包含的数字是否在其中一个基元类型的有效范围内 假设我得到了一个像字符串“1.7976931348623157e350”这样的浮点值,我想看看它是否仍然在原语类型“double”允许的范围内。(在这种情况下,它将不在有效范围内,因为double的最大指数为308)。 我不想使用标准的方法,比如:如何使用Java开发工具(JDT)检查类型范围?,java,string-parsing,primitive-types,eclipse-jdt,Java,String Parsing,Primitive Types,Eclipse Jdt,我想使用JDT解析一个包含数字的字符串,以确定包含的数字是否在其中一个基元类型的有效范围内 假设我得到了一个像字符串“1.7976931348623157e350”这样的浮点值,我想看看它是否仍然在原语类型“double”允许的范围内。(在这种情况下,它将不在有效范围内,因为double的最大指数为308)。 我不想使用标准的方法,比如:Double.parseDouble(“1.7976931348623157e350”),因为我担心如果我有大量的原语类型(我想检查),它可能会太慢 如果您了解
Double.parseDouble(“1.7976931348623157e350”)
,因为我担心如果我有大量的原语类型(我想检查),它可能会太慢
如果您了解Eclipse开发环境,您就会知道,在普通java文件中,Eclipse能够通过在“超出范围”的情况下在变量下方加上红色下划线来判断变量是否超出范围。所以基本上我想使用这个功能。但是你可以猜到,说起来容易做起来难
我已经从这个库开始试验ASTParser:org.eclipse.jdt.core.dom
但我必须承认我在这里不是很成功。
首先,我尝试使用以下方法调用一些vistor方法:
resolveBinding()
,但它们总是只返回我“Null”
我发现了一些有趣的类,名为astsyntaxerrorpopagator
,但我不确定如何正确使用它。它似乎传播解析问题或类似的问题,并获取由某个名为CodeSnippetParsingUtil
的东西类传递的信息。无论如何,这些只是猜测
有人知道如何正确使用这个语法分析器吗
我真的很感谢你的建议。
以下是我尝试调试的一些基本代码:
public class DatatypesParser {
public static void main(String[] args) {
ASTParser parser = ASTParser.newParser(AST.JLS4);
Map options = JavaCore.getOptions();
JavaCore.setComplianceOptions(JavaCore.VERSION_1_7, options);
String statement = new String("int i = " + Long.MAX_VALUE + ";");
parser.setSource(statement.toCharArray());
parser.setKind(ASTParser.K_STATEMENTS);
parser.setResolveBindings(true);
parser.setBindingsRecovery(true);
ASTNode ast = parser.createAST(null);
ast.accept(new ASTVisitor() {
@Override
public boolean visit(VariableDeclarationStatement node) {
CodeSnippetParsingUtil util = new CodeSnippetParsingUtil();
return true;
}
});
}
我不想使用以下标准方法:
Double.parseDouble(“1.7976931348623157e350”),因为我担心
如果我有大量的基元类型,那么速度可能会太慢
我想查查
实际上,JDT正在使用标准的Double
方法来解析值,还有更多的方法——因此,如果性能是一个问题,您应该始终使用标准方法
下面是JDT如何解析double
发件人:
public void computeConstant() {
Double computedValue;
[...]
try {
computedValue = Double.valueOf(String.valueOf(this.source));
} catch (NumberFormatException e) {
[...]
return;
}
final double doubleValue = computedValue.doubleValue();
if (doubleValue > Double.MAX_VALUE) {
// error: the number is too large to represent
return;
}
[...]
}