1 Pytanie: Jak przekonwertować ciąg na liczbę całkowitą z parseInt?

pytanie utworzone w Sun, Apr 28, 2019 12:00 AM

Mam ten kod:

public static void main(String[] args) {
        List<Valtozas> lista = new ArrayList<Valtozas>();

        try {
            File fajl = new File("c://data//uzemanyag.txt");
            Scanner szkenner = new Scanner(fajl, "UTF8");

            while (szkenner.hasNext()) {
                String sor = szkenner.nextLine();
                String [] darabok = sor.split(";");
                String szoveg = darabok[0];
                Valtozas valtozas = new Valtozas(Integer.valueOf(darabok[0]), Integer.valueOf(darabok[1]), Integer.valueOf(darabok[2]));
                lista.add(valtozas);
            }
        }
        catch (Exception e) {

        }


        //3.FELADAT
        System.out.println("3.Feladat: Változások száma: "+lista.size());
    }

}

Tutaj chcę przekonwertować ciąg na int, ale nie mogę. Próbowałem Integer.Valueof (darabok [0]), ale nie działa. I nic się nie dzieje, więc kod jest kompilowany, ale zamknij się na chwilę.

    
1
  1. Spróbuj System.out.println(darabok[0]); i zobacz jaka wartość nie jest a int.
    2019-04-28 00: 20: 28Z
  2. spróbuj zarejestrować błąd w bloku catch, aby sprawdzić, czy naprawdę nic się nie dzieje
    2019-04-28 00: 26: 00Z
  3. Integer.parseInt() oczekuje łańcucha zawierającego tylko znaki numeryczne. Jeśli więc przekażesz coś innego niż permutację znaków „0123456789.E-”, otrzymasz wyjątek.
    2019-04-28 00: 28: 49Z
  4. Opublikuj kilka wierszy pliku, do którego próbujesz uzyskać dostęp. Może nam to pomóc w rozwiązaniu problemu
    2019-04-28 00: 29: 47Z
  5. Nie wycisz swojego try /catch. Pozwól catch poinformować Cię, co jest nie tak.
    2019-04-28 00: 33: 50Z
1 odpowiedzi                              1                         

W oparciu o kod źródłowy, który nam pokazałeś, problem polega na tym, że istnieje niedopasowanie formatu między plikiem wejściowym a programem, który próbujesz odczytać.

Program odczytuje plik po linii i rozdziela go na pola za pomocą pojedynczego średnika (bez białych znaków!) jako separatora plików. Następnie próbuje przeanalizować pierwsze trzy pola każdej linii podziału jako liczby całkowite.

Aby to działało, musi być prawdziwe:

  • Każda linia musi mieć co najmniej trzy pola. (W przeciwnym razie otrzymasz wyjątek ArrayIndexOutOfBound.)
  • Trzy pola muszą być zgodne z następującym wyrażeniem regularnym: -?[0-9]+, tj. opcjonalnym podpisem minus, po którym następuje jedna lub więcej cyfr dziesiętnych.
  • Wynikowa liczba musi zawierać się między Integer.MIN_VALUE a Integer.MAX_VALUE.

Opracowanie powyższego:

  • Początkowe i końcowe białe znaki są niedozwolone.
  • Osadzone znaczniki dziesiętne i znaki grupowania są niedozwolone.
  • Notacja naukowa jest niedozwolona.
  • Liczby zbyt duże lub zbyt małe nie są dozwolone.

Zauważ, że jeśli którekolwiek z powyższych ograniczeń nie zostanie spełnione, system wykonawczy wyśle ​​wyjątek. Niestety, otaczasz swój kod tym:

    try {
        ...
    }
    catch (Exception e) {

    }

W zasadzie ignoruje wszystkie wyjątki, łapiąc je i nie robiąc nic w bloku obsługi. Mówisz do Java „jeśli coś pójdzie nie tak, nie mów mi o tym!”. Oczywiście, Java nie mówi ci, co się dzieje źle.

NIE ZROBIĆ TEGO . Nazywa się to zgniataniem wyjątków i jest to naprawdę zły pomysł 1 .

Istnieją dwa sposoby rozwiązania tego problemu:

  1. Wydrukuj lub zaloguj ślad stosu; np.

      catch (Exception e) {
          e.printStackTrace();
      }
    
  2. Usuń try /catch i dodaj throws IOException do podpisu metody main.

(Nie możesz po prostu usunąć try /catch, ponieważ new Scanner(fajl, "UTF8") rzuca IOException. To sprawdzony wyjątek, więc musi być obsłużony lub zadeklarowany w podpisie metody.)

Gdy już poradzisz sobie z wyjątkiem, otrzymasz komunikat wyjątku i stacktrace, który powie Ci, co właściwie się dzieje. Przeczytaj, zrozum i napraw swój program.


1 - Przypomina to „irytujące” czerwone światło, które wskazuje, że poziom oleju w Twoim samochodzie jest niski!

    
0
2019-04-28 04: 51: 13Z
  1. To jest moja linia, którą próbuję przeczytać: 2011.01.12; 363; 354 ​​2011.01.19; 366; 359 2011.01.26; 363; 359 2011.02.02; 359; 357 2011.02.16; 360; 360 2011.02.23; 365; 362 itd. Zatem moje linie są liczbami, ale aby je przeczytać, muszę przekonwertować na String. Ale potem chcę użyć jako int. Mój wyjątek: java.lang.NumberFormatException: Dla ciągu wejściowego: „2011.01.12” w java.lang.NumberFormatException.forInputString (NumberFormatException.java:65) w java.lang.Integer.parseInt (Integer.java:580) w java .lang.Integer.valueOf (Integer.java:766) w Uzemanyag.main (Uzemanyag.java:21)
    2019-04-28 09: 43: 29Z
  2. Teraz konwertuję tylko drugi i trzeci wiersz oraz jego pracę. Więc nie mogę przekonwertować daty z String na int.
    2019-04-28 10: 02: 41Z
  3. " Więc moje linie są liczbami " - nie zgadzam się z tym, podobnie jak Java. A co najważniejsze, Java jest poprawna. NIE są one liczbami całkowitymi zgodnie z definicją, której używa Java i którą ci podałem. „Więc nie mogę przekonwertować daty z String na int.” - nie możesz tego zrobić używając Integer.parseInt. Ponieważ data jest datą ... nie liczbą całkowitą!
    2019-04-28 10: 08: 11Z
  4. Sposób konwertowania daty na liczbę całkowitą polega na skonstruowaniu i użyciu DateTimeFormatter. W javadoc są przykłady: docs.oracle .com /javase /8 /docs /api /java /time /format /…
    2019-04-28 10: 13: 40Z
  5. Powód, dla którego chcę przekonwertować datę na liczbę całkowitą, ponieważ po tym muszę pracować trochę dalej. Na przykład muszę zdecydować, że rok daty jest równy lub nie. Nie znam tego formatu daty, więc potrzebuję pomocy, aby go zrozumieć. Czy mogę użyć formatu daty, aby podzielić rok lub dzień, aby móc zdecydować, czy jest on równy, czy nie. Moim sposobem na zrobienie tego rozwiązania było to, że mam ten ciąg (data, np. „2012.12.01”) I chcę tego napisu String (String row = v.getDatum (); String [] date = row.split (”. „);). Ale tablica dat jest pusta, więc podział nie działa.
    2019-04-28 14: 22: 48Z
źródło umieszczone tutaj