java.lang.NumberFormatException:对于输入字符串:";空";

java.lang.NumberFormatException:对于输入字符串:";空";,java,Java,我正在分析一个文档,出现以下错误: Exception in thread "main" java.lang.NumberFormatException: For input string: "null" at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1222) at java.lang.Float.valueOf(Float.java:388) at CentroidGener

我正在分析一个文档,出现以下错误:

Exception in thread "main" java.lang.NumberFormatException: For input string: "null"
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1222)
    at java.lang.Float.valueOf(Float.java:388)
    at CentroidGenerator$Centroid.averageLat(CentroidGenerator.java:403)
    at CentroidGenerator.getCentroids(CentroidGenerator.java:30)
    at CentroidGenerator.main(CentroidGenerator.java:139)
这是引发异常的代码部分:

if (latitude!=null) {
    //if (!latitude.equals("null")) {
        String[] latValues = latitude.split(" ");
    float sum = 0;
    for (int i = 0; i < latValues.length; i++) {                
        sum = sum + Float.valueOf(latValues[i].trim()).floatValue();
    }
    latitude = Float.toString(sum / (float) latValues.length);
    //}
}   
if(纬度!=null){
//如果(!latitude.equals(“null”)){
String[]latValues=latitude.split(“”);
浮点数和=0;
对于(int i=0;i
如您所见,我试图检查“null”字符串,但即使取消注释第二条if语句,也会收到相同的错误


谢谢

可能其中一个值是“null”(例如,字符串:
“123.4 null 5 null”
)而不是第一个值,因此我认为合适的解决方案是:

String[] latValues = latitude.split(" ");
float sum = 0;
for (int i = 0; i < latValues.length; i++) {              
    if (!latValues[i].equals("null"))
        sum = sum + Float.valueOf(latValues[i].trim()).floatValue();
}
latitude = Float.toString(sum / (float) latValues.length);

根据您的错误,很可能您的
latValues[i].trim()
会显示值“
null
”。我可以在这里复制您的问题:-

Float.valueOf("null");
这是stacktrace:-

java.lang.NumberFormatException: For input string: "null"
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1301)
    at java.lang.Float.valueOf(Float.java:375)
换句话说,您拥有的值不是null,但它包含单词“null”


如果执行
Float.valueOf(null)
,它实际上为您提供了一个
NullPointerException
,这不是您在这里所拥有的。

为了避免像“1 2”这样的字符串出现问题,多个空格提供空值,最好在循环中添加一个try-catch,如下所示:

if (latitude != null) {
  String[] latValues = latitude.split(" ");
  float sum = 0;
  for (int i = 0; i < latValues.length; i++) {
    try {
      sum = sum + Float.valueOf(latValues[i].trim()).floatValue();
    } catch (NumberFormatException e) {
      e.printStackTrace();
    }
  }
  latitude = Float.toString(sum / (float) latValues.length);
}
if(纬度!=null){
String[]latValues=latitude.split(“”);
浮点数和=0;
对于(int i=0;i
微调功能的调用是无用的。如果您确实希望筛选输入数据以避免出现数字格式异常,您可以在

中找到代码,很明显,问题在于您的输入行中包含字符
“null”
,而不是其中一个数字。但我认为忽略空值不一定是正确的做法

首先,您需要弄清楚这些空值的真正含义:

  • 它们是否表示缺少数据点(纬度值)
  • 它们是捕获原始纬度数据的代码中的错误的症状吗
  • 它们是从输入文件/数据库读取数据的代码中的错误的症状吗
然后,您可能需要跟踪bug或调整处理过程以处理丢失的数据。

如果传递的是null、空格或空白字符串值,则parseInt()和parseDouble()将与NFE一起出错。一旦处理了null条件,它仍然会失败,并显示一个空字符串。尝试在空字符串之前添加一个零,如下所示。它还保持了calc的完整性:

整数.parseInt(“.trim()”)


Integer.parseInt(“0”+“”.trim())

尝试在for循环中添加System.out.println(latValues[i].trim())可能是因为间距问题而将null值作为latValues之一?还有一个可能是在if语句之后,将LatitudeRoll打印回修订版1:由于删除的注释在文本和答案(“第二个if语句…”)中被处理,您忘记关闭.equals(“null”)上的引号。要100%确定,它应该是:
if(!latValues[i].trim().equals(“null”))
如果字符串的数值之间有多个空格,则仍会出现异常。
if (latitude != null) {
  String[] latValues = latitude.split(" ");
  float sum = 0;
  for (int i = 0; i < latValues.length; i++) {
    try {
      sum = sum + Float.valueOf(latValues[i].trim()).floatValue();
    } catch (NumberFormatException e) {
      e.printStackTrace();
    }
  }
  latitude = Float.toString(sum / (float) latValues.length);
}