• 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

Object Storage Arubacloud
0 głosów
133 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,820 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,820 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ź 282 wizyt
pytanie zadane 1 maja 2020 w Java przez BEJU Nowicjusz (180 p.)
0 głosów
1 odpowiedź 172 wizyt
pytanie zadane 8 września 2017 w Java przez TTTF Nowicjusz (120 p.)
0 głosów
1 odpowiedź 217 wizyt

92,566 zapytań

141,420 odpowiedzi

319,609 komentarzy

61,952 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!

...