• 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

VPS Starter Arubacloud
0 głosów
130 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ź 261 wizyt
pytanie zadane 1 maja 2020 w Java przez BEJU Nowicjusz (180 p.)
0 głosów
1 odpowiedź 170 wizyt
pytanie zadane 8 września 2017 w Java przez TTTF Nowicjusz (120 p.)
0 głosów
1 odpowiedź 213 wizyt

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...