sprawdzanie maksymalnej dlugosci stringu

0

Czy sprawdzanie maksymalnej (Integer.MAX_VALUE) długości ciągu ma sens?
Wydaje mi się że nie, bo taka sytuacja i tak nie może mieć miejsca a kompilator lub JVM się wykrzaczy zanim program będzie miał okazję wykonać tą instrukcję... ale zaczynam dopiero swoją przygodę z Javą, i programowaniem w ogóle, dlatego proszę o zdanie kogoś bardziej doświadczonego.

Mam na myśli na przykład:

if (inputString.length() > Integer.MAX_VALUE) {
            throw new IllegalArgumentException("Bad inputString: " + inputString);
        }
0

Metoda length() w klasie String zwraca int-a. Zastanów się, czy int może być większy niż Integer.MAX_VALUE?

0

Poza tym... nawet gdyby to zadziałało, to wypisywanie tak dlugiego stringa jest troche... bez sensu ;p

0
bo napisał(a)

Zastanów się, czy int może być większy niż Integer.MAX_VALUE?

Nie może, teraz to widzę, dzięki :) A tak z ciekawości - kto i co wyrzuci gdybym jednak spróbował stworzyć dłuższy string lub pobrać długość takiego stringa?

[losowa nazwa] napisał(a)

wypisywanie tak dlugiego stringa jest troche... bez sensu ;p

Właśnie o to się rozchodzi, że chcę się zabezpieczyć przed głupimi, bezsensownymi danymi wejściowymi.

0
red123 napisał(a)
bo napisał(a)

Zastanów się, czy int może być większy niż Integer.MAX_VALUE?

Nie może, teraz to widzę, dzięki :) A tak z ciekawości - kto i co wyrzuci gdybym jednak spróbował stworzyć dłuższy string lub pobrać długość takiego stringa?

java.lang.OutOfMemoryError: Java heap space

0

Napisałeś

Właśnie o to się rozchodzi, że chcę się zabezpieczyć przed głupimi, bezsensownymi danymi wejściowymi.

@losowa_nazwa sugerował, że taki

if (inputString.length() > Integer.MAX_VALUE) 
{
     throw new IllegalArgumentException("Bad inputString: " + inputString);
}

sposób zabezpieczenia jest bez sensu, bo tworzysz jeszcze jeden absurdalnie długi String.

0
public class D
{
    public static void main(String[] args)
    {
        StringBuilder sb=new StringBuilder("");
        while(true)
        {
            try
            {
                sb.append("tworzę długi String");
            }
            catch(Throwable e)
            {
                System.out.println(e+" "+sb.length());
                //java.lang.OutOfMemoryError: Java heap space 37 748 725
                System.exit(0);
            }
        }
    }
}
0

Z braku pamięci czy przepełnienia stosu da się wybronić :)

Ciekawostka: rozmiar tablicy w Javie jest przechowywany jako int niezależnie od wersji JVM (32-bit lub 64-bit). Dlatego nawet mając 100 G ramu nie da się utworzyć tablicy większej niż 2^31 - 1 indeksów.

0

Dziękuję za pomoc, sprawa mi się znacznie rozjaśniła.

1 użytkowników online, w tym zalogowanych: 0, gości: 1