• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z przypisaniem wartości do zmiennej za pomocą settera

Object Storage Arubacloud
0 głosów
316 wizyt
pytanie zadane 3 marca 2018 w Java przez Ghost Bywalec (2,930 p.)
class Plik{
    private String odczytanyPlik;

    public void odczytPliku()throws IOException{
        Scanner in = new Scanner(Paths.get("D:\\TestOdczytu.txt"));
        ArrayList<String> tekst = new ArrayList<>(5);

        while(in.hasNextLine()){
            tekst.add(in.nextLine());
        }

        String n = tekst.toString();
        setOdczytanyPlik(n);
    }

    public void setOdczytanyPlik(String msg){
        odczytanyPlik = msg;
    }

    public String getOdczytanyPlik(){
        return odczytanyPlik;
    }
}

 

Próbuje sobie działać na plikach i mam taką klasę, w której odczytuje dane z pliku txt i zapisuje do ArrayList, które następnie chce dać jako String i wywołać za pomocą gettera. Jak próbuje to zrobić to wyświetla się jedynie null, co robię źle?

2 odpowiedzi

0 głosów
odpowiedź 3 marca 2018 przez Wiciorny Ekspert (269,710 p.)
wybrane 4 marca 2018 przez Ghost
 
Najlepsza

Jak wygląda main, tworzysz obiekt/ 

Null jest- bo utworzona tablica jest wypełniona null...

 String n = tekst.toString();

tak napisana wartość "n" jest NULL stąd nulle są wkładane do tablicy. 

jak zaimplementowałeś toString :)? że konwertujesz " obiekt array na string"

bez własnej implementacji powinieneś użyć bazoweg dla klasy Array 

String str = Arrays.toString(arr);
komentarz 4 marca 2018 przez Mateusz51 Nałogowiec (28,180 p.)
Ale tam nie ma pustej tablicy. Jest tylko nowo zainicjalizowany obiekt ArrayList
komentarz 4 marca 2018 przez Wiciorny Ekspert (269,710 p.)
to teraz powiedz mi czym inicjowane są obiekty typu array[ KLASY ARRAY LIST]  na Stosie Javy ...
komentarz 4 marca 2018 przez Mateusz51 Nałogowiec (28,180 p.)
O czym ty pierdzielisz?

Tam nie ma żadnej tablicy. On tworzy obiekt ArrayList o inicjalnej długości 5.
komentarz 4 marca 2018 przez Wiciorny Ekspert (269,710 p.)
komentarz 4 marca 2018 przez Tomasz90 Nałogowiec (25,140 p.)
edycja 4 marca 2018 przez Tomasz90
Nie wiem co miał udowodnić ten przykład ze stackoverflow. Bo tam gość ustawił sobie breakpointa i nie wiedział dlaczego jedną listę ma zainicjalizowaną a drugą nie.

Natomiast w tym wątku autor inicjalizuje listę i ma ją pustą. Nawet, żeby do niej wrzucił same nulle (przed czym go to sprawdzenie w pętli i tak zabezpieczy) to i tak mu nie poleci NullPointerException tylko dostanie [null, null, ...]. Błąd jest tak jak zauważył Mateusz - gdzieś wcześniej. Tyle, że autor nie wrzucił stacktrace'a to nie da się określić gdzie a jedynie można go nakierować, żeby sobie na debugu odpalił aplikację i przeanalizował, ewentualnie jakieś logowanie wrzucił na początku metody, żeby sprawdzić czy rzeczywiście tam null nie leci.
0 głosów
odpowiedź 3 marca 2018 przez niezalogowany

A czy wywołujesz metodę odczytPliku przed wypisaniem elementów? U mnie wszystko działa: 

 

import java.io.IOException;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Scanner;

public class Plik {

    private static String odczytanyPlik;

    public void odczytPliku()throws IOException{

        Scanner in = new Scanner(Paths.get("C:\\message.txt"));
        ArrayList<String> tekst = new ArrayList<>();

        while(in.hasNextLine()){
            tekst.add(in.nextLine());
        }

        String n = tekst.toString();
        setOdczytanyPlik(n);
    }

    private void setOdczytanyPlik(String msg){
        odczytanyPlik = msg;
    }

    private String getOdczytanyPlik(){
        return odczytanyPlik;
    }

    public static void main(String[] args) {

        Plik plik = new Plik();
        try {
            plik.odczytPliku();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(plik.getOdczytanyPlik());
    }
}
komentarz 3 marca 2018 przez Wiciorny Ekspert (269,710 p.)
 private String getOdczytanyPlik(){
        return odczytanyPlik;
    }

metody get/set nie powinny ( wręcz nie mogą być prywatne ) łamie to tzw zasady Hermetyzacji. Gdyż metody te służą aby korzystać z nich "dla ogółu' a czyniąc je prywatnymi dostęp z poza klasy jest niemożliwy, czyli ich sens traci znaczenie.e 

Maksymalna dopuszczalność: to czasem PRIVATE- wtedy spełnia to warunki dziedziczenia więc z jednej strony jest okej, z drugiej dostępność jest dla klas w PACZCE :) 

JEDNAK NADAL SENS GETERA/SETERA staje się wtedy redundancją 

1
komentarz 3 marca 2018 przez niezalogowany
Zastosowałem podpowiedzi Inteliijj, a nawet nie spojrzałem, co IDE zmieniło (sugeruje zmianę tych metod na prywatne :)).
komentarz 3 marca 2018 przez Wiciorny Ekspert (269,710 p.)
Spoko piszę dla potomnych jak ot mówią :D

Podobne pytania

0 głosów
1 odpowiedź 129 wizyt
0 głosów
1 odpowiedź 160 wizyt
pytanie zadane 19 lipca 2019 w C i C++ przez Semcio Początkujący (340 p.)
+1 głos
1 odpowiedź 189 wizyt
pytanie zadane 18 maja 2021 w C# przez NoQu Nowicjusz (130 p.)

92,555 zapytań

141,402 odpowiedzi

319,553 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...