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

java wskazywanie na obiekt przez stworzeniem go

0 głosów
268 wizyt
pytanie zadane 26 sierpnia 2018 w Java przez kvbq Obywatel (1,490 p.)

Witam,

Przy próbie uruchomienia programu wyświetla mi się seria błędów. 

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.pc.numbershapes/com.example.pc.numbershapes.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.Window.findViewById(int)' on a null object reference
                                                                                 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2927)
                                                                                 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2988)
                                                                                 at android.app.ActivityThread.-wrap14(ActivityThread.java)
                                                                                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1631)
                                                                                 at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                 at android.os.Looper.loop(Looper.java:154)
                                                                                 at android.app.ActivityThread.main(ActivityThread.java:6682)
                                                                                 at java.lang.reflect.Method.invoke(Native Method)
                                                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
                                                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
                                                                              Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.Window.findViewById(int)' on a null object reference
                                                                                 at android.app.Activity.findViewById(Activity.java:2453)
                                                                                 at com.example.pc.numbershapes.Uzytkownik.<init>(Uzytkownik.java:20)
                                                                                 at com.example.pc.numbershapes.MainActivity.onCreate(MainActivity.java:40)
                                                                                 at android.app.Activity.performCreate(Activity.java:6942)
                                                                                 at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1126)
                                                                                 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2880)
                                                                                 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2988) 
                                                                                 at android.app.ActivityThread.-wrap14(ActivityThread.java) 
                                                                                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1631) 
                                                                                 at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                                 at android.os.Looper.loop(Looper.java:154) 
                                                                                 at android.app.ActivityThread.main(ActivityThread.java:6682) 
                                                                                 at java.lang.reflect.Method.invoke(Native Method) 

 

Przeczytałem gdzieś, że to ma to związek z próbą wykonywania operacji na obiekcie związanym z layoutem zanim zostanie utworzony (layout) . Dodałem więc wszystkie zmienne, które mogą go używać do konstruktora klasy, którą z kolei tworzę na sam koniec funkcji onCreate. 

Kod ActivityMain:

package com.example.pc.numbershapes;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;

import java.lang.Math;

public class MainActivity extends AppCompatActivity {


   Uzytkownik uzytkownik;

    public void onClick(View view)
    {

        pierwiastek(uzytkownik.dajLiczbeI());

    }


    public boolean pierwiastek(int liczbaUzytkownika)
    {

        double wynik;

        wynik = Math.sqrt(liczbaUzytkownika);

        Log.i("Wynik pierwiastkowania",String.valueOf(wynik));

        return false;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        uzytkownik= new Uzytkownik();
    }
}

Kod klasy:

package com.example.pc.numbershapes;

import android.app.Activity;
import android.widget.EditText;


public class Uzytkownik  extends Activity{

    EditText liczba;
    String liczbaS;
    int liczbaI;


    public Uzytkownik()
    {

        liczba = (EditText) findViewById(R.id.editText);

        liczbaS = liczba.toString();

        liczbaI = Integer.parseInt(liczbaS);

    }


    public int dajLiczbeI()
    {

        return liczbaI;

    }

}

 

2 odpowiedzi

0 głosów
odpowiedź 26 sierpnia 2018 przez KubenQPL Maniak (62,840 p.)
wybrane 27 sierpnia 2018 przez kvbq
 
Najlepsza

Nowe Activity się otwiera za pomocą intenta, ty nie wywołujesz konstruktora Activity.

Intent intent = new Intent(this, Uzytkownik.class);
startActivity(intent);

Przypisanie widoków do zmiennych robisz w onCreate po wywołaniu "setContentView" a nie w konstruktorze

komentarz 26 sierpnia 2018 przez kvbq Obywatel (1,490 p.)
Próbowałem zastosować się do rady jednak jako że jestem początkujący musiałem poszukać w Google paru rzeczy. Przeczytałem, że intnet to coś w rodzaju łącznika między aktywnościami, a nowe activity oznacza coś w stylu nowego okna w aplikacji, a ja myślałem że przez extends Activity() dziedziczę z klasy Activity (co według tego co przeczytałem też jest po części prawdą). Jednak dodałem "extends Activity()" ponieważ nie działała mi funkcja findViewById, która działała w klasie MainActivity gdzie jest dopisane "extends AppCompatActivity" (skróciłem do Activity() bo przeczytałem, że lepiej jest tego używać),  a klasa Uzytkownik jest do przechowywania jednej liczby wpisanej przez uzytkownika do EditText (wiem, że wystarczyłoby stworzyć tę zmienną w ActivityMain ale chodziło o naukę i użycie klas w praktyce)

W każdym razie dodałem funkcję onCreate w klasie Uzytkownik a tam setContentView() oraz te 2 linijki z intentem, bo nie za bardzo widziałem gdzie indziej mógłbym je dać skoro mają być wywołane przy tworzeniu klasy. Mimo wszytko nadal nie działa.

PS Jako, że nie chce bezmyślnie przepisywać kodu tylko go rozumieć, to jeśli w moim rozumowaniu są jakieś błędy to proszę mi je wytłumaczyć.
1
komentarz 26 sierpnia 2018 przez KubenQPL Maniak (62,840 p.)
Ale to że klasa Uzytkownik dziedziczy po Activity to nie znaczy że teraz będziesz mógł wyszukiwać widoki z MainActivity. Skoro chcesz przechowywać w innej klasie dane które przekazuje użytkownik to pobierz te dane z widoków w MainActivity i przekaż do klasy Uzytkownik.
0 głosów
odpowiedź 26 sierpnia 2018 przez miro Pasjonat (23,870 p.)
Strzelam, bo nie mam skonfigurowanego środowiska pod Androida:

Masz błąd w:

com.example.pc.numbershapes.Uzytkownik.<init>(Uzytkownik.java:20)

Czy nie powinnieneś wydobyć string z EditText przez getText()?

Podobne pytania

0 głosów
1 odpowiedź 481 wizyt
pytanie zadane 1 maja 2020 w Java przez BEJU Nowicjusz (180 p.)
0 głosów
1 odpowiedź 256 wizyt
pytanie zadane 8 września 2017 w Java przez TTTF Nowicjusz (120 p.)
0 głosów
1 odpowiedź 345 wizyt

93,692 zapytań

142,611 odpowiedzi

323,220 komentarzy

63,220 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...