Wydaje się to super proste, ale nie mogę znaleźć, jak powstrzymać błąd. Wewnątrz, jeśli na zmiennej repairDetails otrzymuję błąd mówiąc, że jest już zdefiniowany w zakresie. W jaki sposób chodzę na poruszanie się tego, jakby to jest NULL, że nadal chcę użyć tej zmiennej, ale ustaw ją jako coś innego jak poniżej.

Realm realm = Realm.getDefaultInstance();

RepairDetails repairDetails = realm.where(RepairDetails.class).equalTo("deviceId", device.id).findFirst();

if(repairDetails == null){
    RepairDetails repairDetails = new RepairDetails();
}
2
Lewis Smith 4 czerwiec 2018, 12:24

3 odpowiedzi

Najlepsza odpowiedź

Dlaczego mój kod jest uszkodzony tutaj?

Kiedy kompilator Java zobaczył typ znów wymieniony, RepairDetails repairDetails = new RepairDetails();

Zakłada, że próbujesz zdefiniować zmienną. Jednak masz już zmienną dostępną w zasięgu zewnętrznym.

Prawidłowy kod po prostu upuszcza typ, umożliwiając przypisanie naprawy naprawy.

if(repairDetails == null){
    repairDetails = new RepairDetails();
}

Który zamienia repairDetails = new RepairDetails(); w zadanie zamiast zmiennej deklaracji.


(Spokrewnieni, ale pytanie, które zwykle następuje po tym, jak ktoś prowadzi do tej kwestii i myśli, że widzieli to wcześniej)

Dlaczego jest w porządku, gdy zasięg zewnętrzny był członkiem lub członkiem klasy super?

https://docs.oural.com/javase/tutorial/jawa/ Javaoo / Variate.html ma sekcję, która wspomina o zmiennych z członków członek , ale zmienne lokalne zachowują podobnie, z wyjątkiem tego, że są zawarte do ich zakresu sposobu / szelki, które są one zdefiniowane, raczej wtedy klasa.

Istnieje kilka razy, że Java umożliwia zderzenie nazwy zmiennych z zakresów, jest wtedy, gdy jest to zmienna lokalna nadrzędna zmienna członka. (Parametr jest również zmienną lokalną) lub jest związany z dziedzictwem.

Jest znany jako ukrywanie. https://docs.Oreacle.com/javase/tutorial/java/ Iandi / hidevariatles.html

Metody mogą być również ukryte. https://docs.Oracle.com/javase/tutorial/java/ Iandi / override.html

Ale zachowanie nie jest tego, czego się spodziewasz.

Powodem, dla którego jest to nieuniknione, jest to, że członkowie mogą być zastępcze przez dziedzictwo, a super klasa może zdefiniować członek, który był wcześniej stosowany w zakresie lokalnym na klasie dzieci.

Więc projektanci Java dozwolone ukrywają się, ponieważ jest to mniejszy z 2 zła, biorąc pod uwagę, że możesz ujednoznaczyć między Super członkom, członkom klasie i mieszkańcom prefiksowanie nazwy zmiennej z

  • członek: this.repairDetails,
  • Super członek: super.repairDetails,
  • Lokalny: repairDetails
11
Ryan The Leach 4 czerwiec 2018, 09:45

Problem polega na tym, że próbujesz zdefiniować nową zmienną.

Zmienić

if(repairDetails == null){
    RepairDetails repairDetails = new RepairDetails();
}

Do

if(repairDetails == null){
    repairDetails = new RepairDetails();
}

I powinno działać.

Nie potrzebujesz definicji typu po raz drugi i dlatego otrzymujesz błąd.

6
glm9637 4 czerwiec 2018, 09:27

Wystarczy usunąć drugą deklarację w IF:

RepairDetails repairDetails = new RepairDetails();

Powinien być tylko:

repairDetails = new RepairDetails();

W ten sposób nadpisujesz wcześniej zadeklarowaną zmienną, a nie tworząc nowy w zakresie.

4
Lino 4 czerwiec 2018, 09:25