[Konwersja] null > int

0

Witam
zauważyłem, że metoda, która w pewnym wypadku zwraca do zmiennej wartość null (String) nie może zostać przekonwertowana na int. Oto kody:

try {
            BufferedReader is = new BufferedReader(new InputStreamReader(System.in));
            inputLine = is.readLine();
            if(inputLine.length() == 0) return null;
        } catch (IOException e) {
            System.out.println("IOException: " + e);
        }

To jest "generator" nulla (jeśli ktoś nic nie wpisze, to niech zwróci wartość null)
I konwersja:
int guess = Integer.parseInt(stringGuess);
Wywołanie (w jaki sposób to przebiega):
Funkcja pobierająca tekst --> Zmienna (String) --> Konwersja na int --> Zmienna2 (int)

Ponieważ uczę się Javy, bardzo mnie zdziwił wyjątek, który informuje, że nie można przekonwertować "nic" na liczbę

Exception in thread "main" java.lang.NumberFormatException: null

Fakt, że można zamienić null na "0", ale takie rozwiązanie jest wysoce niekomfortowe, ponieważ gdybym wykorzystywał takie coś z funkcjach operujących na "stringach" to by jakieś głupoty wyszły.

Ten kod to przykład z książki Head First. Java (ang.). Oczywiście tamtejsze przykłady mają trochę daleko do ideału, mogę też je wkleić. Bardzo bym prosił o pomoc jak to rozwiązać, chyba że w ogólnie zły sposób kod został napisany i lepiej by było od nowa (w takim wypadku prosiłbym o wskazówki).

0

Ale w czym jest problem ? Bo jakos nie za bardzo zrozumialem ;p
Chcesz miec zero, gdy jest null ?

int guess = 0;
if (staringGuess != null) guess = Integer.parseInt(staringGuess);
0

int jest typem prostym i jako taki nie ma wartości null i musi być zainicjowany. Pamiętaj że wartość zero jest taką sama wartością jak 1 czy 100 i nie możesz/powinieneś wykorzystać jej jako nośnika informacji o tym czy był null. Żeby przekazać wartość null musisz użyć obiektu klasy Integer.

   Integer guess = null;
   try  
   {  
      guess = Integer.valueOf(stringGuess);
   }  
   catch( Exception )  
   {  
     guess = null;
   }  
0

Ok, jeszcze raz bo napisałem tak, że jest trochę pogmatwane.

String pusty = null; 
int liczba = Integer.parseInt(pusty); // To daje błąd

Może to i jakieś złe przyzwyczajenie z PHP myślałem, że
null = 0 = false = ""
ale mam jeszcze jedno pytanie: Czy null (int) = 0 (int) ??
I powrót do mojego wcześniejszego pytania: Czy da się przkonwertować String null na int ?

0
  1. Prymitywny typ int nie może mieć wartości null. Sprawdź sobie taki kawałek kodu i zobacz co ci zgłosi kompilator:
int test;
int test2 = null;
if (i == null) System.out.println("a"); 
System.out.println(test)
  1. Prymitywny typ int nie może mieć wartości null. Klasa Integer to co innego:-)
Integer test;
Integer test2 = null;
if (i == null) System.out.println("a"); 
System.out.println(test)

3 Nie kumam dlaczego tak uparcie uważasz że 0 to jakaś wartość gorszej kategorii i że możesz ją poświęcić dla null? 10 - 10 = null ? nie widzisz pewnego absurdu? Można zrobić pewien wybieg i założyć że twój algorytm nie używa jakiegoś bitu tak jak jest kodowany znak minus. Tylko po co skoro masz Integer.

0
Trees napisał(a)

Może to i jakieś złe przyzwyczajenie z PHP myślałem, że null = 0 = false = ""

Nie ze zle, ale w Jabie tak to ne dziala.

Trees napisał(a)

ale mam jeszcze jedno pytanie: Czy null (int) = 0 (int) ??

Nie.

Trees napisał(a)

I powrót do mojego wcześniejszego pytania: Czy da się przkonwertować String null na int ?

Nie da sie, przeciez dostajesz blad nie? Ale mozesz tak:

String s = ...// jakis string
int i;
if (s == ) {
    i = 0;
} else {
    i = Integer.parseInt(s);
}

</quote></quote>

0

Aha, czyli jednak błąd przykładu w książce. Dzięki za pomoc :-)

0

Metoda zwracająca null informuje tylko o tym, że nie ma żadnego obiektu do zwrócenia. Pamiętaj, że zmienna String tekst = null; nie jest tak naprawdę pustym tekstem, a referencją do obiektu tekstu, którego w ogóle nie ma. Nie można parsować tekstu, którego nie ma. Stąd wyjątek. Bo i sytuacja jest wyjątkowa - nie ma czego parsować, więc żaden wynik parsowania nie może być prawidłowy.

0

10 - 10 = null ?

Jednakże po zastanowieniu stwierdzam, że 10-10 = null, bo 0 jest wartością, ale taką, która oznacza nic. No ok, najwyraźniej to jest ta niewygoda ścisłej typizacji, bo w innych popularniejszych językach zero to null, tylko jako liczba. No ale ok, jakoś się przyzwyczaję.
Czy w ogóle String zawierający znaki niebędące cyframi można zamienić na int?

0

Musisz usunąć wszystko co nie jest cyfrą.

	String a = "121231aasasa12121";
		a = a.replaceAll("[^\\d]","");

</cpp>
0
Trees napisał(a)

10 - 10 = null ?

Jednakże po zastanowieniu stwierdzam, że 10-10 = null, bo 0 jest wartością, ale taką, która oznacza nic. No ok, najwyraźniej to jest ta niewygoda ścisłej typizacji, bo w innych popularniejszych językach zero to null, tylko jako liczba. No ale ok, jakoś się przyzwyczaję.
Czy w ogóle String zawierający znaki niebędące cyframi można zamienić na int?

Poddaje się, ale żeby dać ci do myślenia to

  1. Skoro 0 oznacza nic to -1 oznacz mniej niż nic.
  2. Dla typu string to jeszcze jest bardziej skomplikowane, bo
String a = null
String b = "";
String c = " ";
0
Trees napisał(a)

Jednakże po zastanowieniu stwierdzam, że 10-10 = null, bo 0 jest wartością, ale taką, która oznacza nic.

... 0 jest wartością. Brak wartosci oznacza nic. To, co napisales to tylko bledny przeklad zalozen niektorych jezykow (najczesciej skryptowych).

Trees napisał(a)

No ok, najwyraźniej to jest ta niewygoda ścisłej typizacji, bo w innych popularniejszych językach zero to null, tylko jako liczba.

W PHP tez sa sytuacje, gdzie "0" i "null" w instrukcji warunkowej maja rozna semantyke.

Trees napisał(a)

No ale ok, jakoś się przyzwyczaję.

W Objective-C sa 3 rozne reprezentacje null'a (NULL, nil, NSNull) i jeszcze to nieszczesne "0", wiec nie ma co narzekac.

0

Liczby nie możesz porównywać do null bo null należy do typu referencji i oznacza referencję pustą oprócz wszelkich innych referencji, które wskazują na obiekty. Jest to jedyna wartość, która pasuje do wszystkich typów referencyjnych i oznacza referencję, która zawsze nie jest prawidłowa. Nie można w ogóle porównywać jej z liczbami bo jest to zupełnie inny typ. A to, że wartość referencji null na maszynach typu PC składa się z samych bitów zero, to po prostu specyfika maszyny. Na innym typie komputera referencja pusta mogłaby mieć inną reprezentację fizyczną - na przykład wskazywać na inny zabroniony obszar pamięci niż adres 0. Mogłaby mieć równie dobrze różne reprezentacje - byle były traktowane jako null. Na przykład wszelkie wskaźniki i referencje w 32-bitowym Windows XP od zakresu 231..232-1 oraz zero mogłyby reprezentować wartość referencji null.
Gdyby je wszystkie skonwertować na int po ich reprezentacji, to wyszłyby z tego duże liczby ujemne różniące się między sobą wartościami oraz zero.

0

autor:
A co by było jeśli chciałbym mieć np zmienną trzymającą ostatnio wpisaną przez użytkownika wartość? Normalnie 0 oznacza tu, że użytkownik wpisał 0, a null oznacza, że jeszcze żadnej wartości nie wpisywał. W przypadku null == 0 sprawa byłaby trudniejsza.

Poza tym np rzutowanie nullowej referencji do obiektu klasy np Kot na zero jest co najmniej nieprzemyślane.

Null jest wartością, która pasuje do każdego typu referencji, dlatego więc poniższy kod wykona się bez błędu rzutowania:

package test;

public class Main {

    static void metoda(Object a) {
        String b = (String) a;
        if (b == null) {
            System.out.println("mamy nulla");
        }
    }

    public static void main(String[] args) {
        Exception a = null;
        metoda(a);
    }
}

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