java.lang.NumberFormatException: Pentru șirul de intrare: „null” (Programare, Java)

aneuryzm a intrebat.

Analizez un document și primesc următoarea eroare:

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)

Aceasta este partea de cod care aruncă excepția:

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);
    //}
}   

După cum puteți vedea, am încercat să verific dacă există șiruri de caractere „null”, dar chiar și descomentând a doua instrucțiune if, primesc aceeași eroare.

mulțumesc

Comentarii

  • Încercați să adăugați un System.out.println(latValues[i].trim()) în interiorul buclei for, este posibil să primiți valoarea nulă ca fiind unul dintre latValues din cauza unei probleme de spațiere? Și, eventual, una chiar după instrucțiunea if pentru a imprima latitudinea –  > Por Mike.
  • Revenire la Revizuirea 1: deoarece comentariul șters este abordat în text și în răspunsuri („…a doua instrucțiune if…”).  > Por utilizator85421.
6 răspunsuri
MByD

Poate că una dintre valori este „null” (de exemplu, șirul de caractere : "123.4 null 5 null") și nu prima, deci cred că o soluție corectă va fi::

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);

sau în schimb, adăugați try-cath în interiorul buclei for și ignorați valorile care nu sunt numere.

EDITARE

După cum a subliniat în comentarii (Sualeh), este mai bine să folosiți try / catch, deoarece astăzi este „null” mâine este altceva (de exemplu, spații duble…).

try {
sum = sum + Float.valueOf(latValues[i].trim()).floatValue();
}
catch (NumberFormatException e)
{
// log e if you want...
}

Comentarii

  • ai uitat să închizi ghilimelele de pe .equals(„null”) -.  > Por Mike.
  • Pentru a fi 100% sigur, ar trebui să fie: if (!latValues[i].trim().equals("null")) –  > Por Stephen C.
  • Acest lucru va da totuși excepții dacă șirul de caractere are mai multe spații între valorile numerice. –  > Por Sualeh Fatehi.
Sualeh Fatehi

Pentru a evita problemele cu șiruri de caractere precum „1 2”, cu mai multe spații, care dau valori nule, cel mai bine este să adăugați un try-catch în interiorul buclei, ca acesta:

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);
}

Stephen C

Este destul de clar că problema constă în faptul că aveți o linie de intrare care are caracterele "null" în locul unuia dintre numere. Dar nu cred că ignorarea caracterelor nule este neapărat un lucru corect de făcut.

În primul rând, trebuie să vă dați seama ce înseamnă cu adevărat acele nulități:

  • Reprezintă ele puncte de date lipsă (valori de latitudine)?
  • Sunt ele un simptom al unei erori în codul care a capturat datele originale de latitudine?
  • sunt un simptom al unei erori în codul care a citit datele dintr-un fișier de intrare / bază de date?

Atunci poate că trebuie să depistați bug-ul / bug-urile sau să vă ajustați procesarea pentru a face față datelor lipsă.

limc

Pe baza erorii dvs. latValues[i].trim() afișeze valoarea „null„. Sunt capabil să reproduc problema dvs. aici:-

Float.valueOf("null");

Iată stacktrace-ul:-

java.lang.NumberFormatException: For input string: "null"
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1301)
    at java.lang.Float.valueOf(Float.java:375)

Cu alte cuvinte, valoarea pe care o aveți nu este nulă, dar conține cuvântul „null”.

Dacă faceți Float.valueOf(null);, , aceasta vă oferă de fapt o valoare NullPointerException, , ceea ce nu este ceea ce aveți aici.

Fabian Tschachtli

Apelul funcției trim este inutil. Dacă doriți cu adevărat să ecranați datele de intrare pentru a evita NumberFormatException, găsiți codul din JavaDocs for Doubles

user365757534

Funcțiile parseInt() și parseDouble() vor da eroare cu NFE dacă sunt transmise cu o valoare de șir de caractere nulă, spațiu sau goală. După ce ați gestionat condiția nulă, va eșua în continuare cu un șir gol. Încercați să adăugați un zero înainte de șirul gol, ca mai jos. Aceasta menține și integritatea calcului:

Integer.parseInt(” „.trim()))

la

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

Tags: