HILFE!!--- bekomme immer Java Nullpointer Exception

  • Antworten:18
  • OffenNicht stickyBentwortet
  • Forum-Beiträge: 7

05.07.2016, 11:28:46 via Website

Hallo,

es wäre super wenn ihr mir helfen könntet meinen fehler zu finden. Ich steh hier nämlich gerade etwas auf dem Schlauch.

Ich probiere eine eigene App zu entwickeln. Als beispiel und einstieg in das thema habe ich probiert an einer app zu arbeiten in der "aktuell" seifenblasen "gefangen/ berührt" werden müssen. Die Seifenblasen bewegen sich über den bildschirm und sollen bei berührung zerplatzen...später sollte dann noch (auf basis dieses spielprinzips) ein highscore und mehrere levels für meine eigentliche App dazu kommen.

jedoch komme ich nicht über den startbildschirm hinaus und bekomme immer eine Java Nullpointer exception auf die ich mir nicht zu helfen weiß. Vielleicht könnt ihr mir ja helfen.

Anbei der Code für meine beiden Klassen MainActivity und Bubble:
MainActivity:

package com.example.k.soapbubbleburst;

import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.media.Image;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.FrameLayout;
import android.widget.ImageView;

import java.util.HashSet;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import de.spas.tools.SimpleAnimationListener;

public class MainActivity extends Activity implements View.OnClickListener, Bubble.OnBurstListener{

private ViewGroup container;
private static final int BUBBLE_MAX = 10;
private static final float V_MAX = 1f;
private static final float SIZE_MAX = 128f;
private Random rnd = new Random();
private Drawable bubbleDrawable;
private Set<Bubble> bubbles = new HashSet<Bubble>();
private float density;
private ScheduledExecutorService executor;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    container = (ViewGroup) findViewById(R.id.container);

   /* showStartFragment(); */

    bubbleDrawable = getResources().getDrawable(R.drawable.soapbubble);
    density = getResources().getDisplayMetrics().density;
}

private void showStartFragment(){
    container.removeAllViews();
    View start = getLayoutInflater().inflate(R.layout.start, null);
    start.findViewById(R.id.start).setOnClickListener(this);
    container.addView(start);

    Animation a = AnimationUtils.loadAnimation(this, R.anim.abc_fade_in);
    start.startAnimation(a);
}

@Override
public void onClick(View v) {
    if(v.getId()==R.id.start){
        Animation a = AnimationUtils.loadAnimation(this,R.anim.pulse);
        a.setAnimationListener((new SimpleAnimationListener() {
            @Override
            public void onAnimationEnd(Animation animation) {
                startGame();
            }
        }));

        v.startAnimation(a);
    }
}

private float scale(float v){
    return density * v;
}

public void startGame(){

    container.removeAllViews();
    bubbles.clear();
    for (int i=0; i<BUBBLE_MAX; i++){
        bubbles.add(new Bubble((FrameLayout)container, scale(V_MAX), scale(SIZE_MAX), rnd, bubbleDrawable, this));
    }
    executor = Executors.newSingleThreadScheduledExecutor();
    executor.scheduleAtFixedRate(moveRunnable, 0, 50, TimeUnit.MILLISECONDS);
}

@Override
protected void onPause(){
    super.onPause();
    executor.shutdown();
    bubbles.clear();
}

@Override
protected void onResume(){
    super.onResume();
    showStartFragment();
}

private Runnable moveRunnable= new Runnable(){
    @Override
    public void run(){
        for(final Bubble b: bubbles){
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    b.move();
                }
            });
        }
    }
};

@Override
public void onBurst(Bubble b) {
    bubbles.remove(b);
    bubbles.add(new Bubble((FrameLayout)container, scale(V_MAX), scale(SIZE_MAX), rnd, bubbleDrawable, this));
}

}

UND BUBBLE:
package com.example.k.soapbubbleburst;

import android.graphics.drawable.Drawable;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;

import java.util.Random;

public class Bubble implements View.OnClickListener {
interface OnBurstListener {
void onBurst(Bubble b);
}
private OnBurstListener burstListener;
private float x, y, vx, vy, size;
private int lifetime;
private ImageView view;

public Bubble(FrameLayout container, float vMax, float sizeMax, Random rnd, Drawable drawable, OnBurstListener listener) {
    burstListener = listener;
    lifetime= 1000;
    size = (0.5f + rnd.nextFloat() / 2) * sizeMax;
    x = rnd.nextFloat() * (container.getWidth() - size);
    y = rnd.nextFloat() * (container.getHeight() - size);
    vx = rnd.nextFloat() * vMax * (rnd.nextBoolean() ? 1 : -1);
    vy = rnd.nextFloat() * vMax * (rnd.nextBoolean() ? 1 : -1);
    view.setImageDrawable(drawable);
    view.setOnClickListener(this);
    container.addView(view);
    move();


}

public void move(){
    x += vx;
    y += vy;
    FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) view.getLayoutParams();
    params.width = Math.round(size);
    params.height = Math.round(size);
    params.leftMargin = Math.round(x);
    params.topMargin = Math.round(y);
    params.gravity = Gravity.LEFT + Gravity.TOP;
    view.setLayoutParams(params);
    lifetime--;
    if (lifetime <= 0) burst();

}

private void burst() {
    ViewGroup parent = (ViewGroup) view.getParent();
    burstListener.onBurst(this);
    if (parent !=null) parent.removeView(view);
}

@Override
public void onClick(View v) {
    burst();
}

}

und hier mein ausgegebener fehler:

07-05 11:10:54.410 20364-20364/com.example.k.soapbubbleburst E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.k.soapbubbleburst, PID: 20364
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setImageResource(int)' on a null object reference
at com.example.k.soapbubbleburst.Bubble.(Bubble.java:31)
at com.example.k.soapbubbleburst.MainActivity.startGame(MainActivity.java:84)
at com.example.k.soapbubbleburst.MainActivity$1.onAnimationEnd(MainActivity.java:67)
at android.view.animation.Animation$3.run(Animation.java:374)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5538)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

— geändert am 05.07.2016, 11:33:17

Antworten
  • Forum-Beiträge: 2.492

05.07.2016, 12:12:14 via Website

at com.example.k.soapbubbleburst.Bubble.(Bubble.java:31) 

In Zeile 31 der Klasse Bubble entsteht der Fehler, könntest du uns die noch eben nennen?

Du schreibst view.setImageDrawable(..) und ich vermute du hast das view vorher nicht initialisiert, deswegen die NullPointerException.

— geändert am 05.07.2016, 12:13:23

Ludy

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.183

05.07.2016, 12:13:12 via App

Die ImageView ist null d.h die ist nicht gesetzt oder wird nicht gefunden

— geändert am 05.07.2016, 12:14:13

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
  • Forum-Beiträge: 2.909

05.07.2016, 12:17:15 via Website

[EDIT - da war ich wohl zu langsam im Schreiben meiner Antwort und kürze es ab :-)

Hallo K.S

Poste doch mal Bitte von Bubble.java die Zeilen 1-40

— geändert am 05.07.2016, 12:53:35

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 7

05.07.2016, 14:32:44 via Website

package com.example.k.soapbubbleburst;

import android.graphics.drawable.Drawable;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;

import java.util.Random;

public class Bubble implements View.OnClickListener {
interface OnBurstListener {
void onBurst(Bubble b);
}
private OnBurstListener burstListener;
private float x, y, vx, vy, size;
private int lifetime;
private ImageView view;

public Bubble(FrameLayout container, float vMax, float sizeMax, Random rnd, Drawable drawable, OnBurstListener listener) {
    burstListener = listener;
    lifetime= 1000;
    size = (0.5f + rnd.nextFloat() / 2) * sizeMax;
    x = rnd.nextFloat() * (container.getWidth() - size);
    y = rnd.nextFloat() * (container.getHeight() - size);
    vx = rnd.nextFloat() * vMax * (rnd.nextBoolean() ? 1 : -1);
    vy = rnd.nextFloat() * vMax * (rnd.nextBoolean() ? 1 : -1);
    view.setImageDrawable(drawable);
    view.setOnClickListener(this);
    container.addView(view);
    move();


}

public void move(){
    x += vx;  

das sind die zeilen 1-40
:)

— geändert am 05.07.2016, 14:37:47

Antworten
  • Forum-Beiträge: 7

05.07.2016, 14:35:24 via Website

view.setImageDrawable(drawable);

das ist die zeile 31.... ich hab auch schon spekuliert das dort der fehler ist, jedoch weiß ich mir trotzdem nicht zu helfen :D

ps im ordner drawable befindet sich nur eine datei mit dem namen soapbubble

Antworten
  • Forum-Beiträge: 2.909

05.07.2016, 14:39:54 via Website

Jetzt wird es ein wenig klarer..

Zeile 31 / 32 / 33

du versuchst etwas mit der view zu machen , hast sie aber nirgendwo initiiert.
Die ist leer /NULL weil sie nur oben deklariert wurde

private ImageView view;

ergo : Wo soll denn die view herkommen - aus einem Layout ??

Dann müsstest du vorher sowas hier tun

  view =(ImageView) findViewById(R.id.myimageview);

Deine Blubble funktion weis also gar nicht , wohin/wo hinein sie das drawable "malen" soll.
Und dein OnClicklistener, weis auch nicht worauf er reagieren soll.

— geändert am 05.07.2016, 15:54:57

Liebe Grüße - Stefan
[ App - Entwicklung ]

K.S.

Antworten
  • Forum-Beiträge: 7

05.07.2016, 14:41:37 via Website

Die view wird bei mir initialisiert mit private ImageView view;

Antworten
  • Forum-Beiträge: 2.909

05.07.2016, 14:59:56 via Website

.. WIe Lars schon richtig ausgeführt hat.

Deklarieren : Ich brauche in meiner APp eine View mit der ich später etwas anfangen möchte
Initiiieren : Ich weise der jetzt einen wert / Platz etc zu , dann kann sie auch werklen.

Bsp : Du hast einen Eimer deklariert und weist diesem jetzt wasser zu (initiieren) , DAMIT du ihn ausschütten kannst.
Sonst ist er leer und kann kein wasser ausschütten.

Noch ein beispiel :

Integer a = 2;
Integer b;

a+ b = (Absturz)

wenn aber vorher da stehen würde

b = 10;

Dann ergäbe das

a + b = 12;

P.S ohne dir nahe zu treten, allerdings ist das ein must have basic-wissen für alle programmiersprachen

— geändert am 05.07.2016, 15:19:47

Liebe Grüße - Stefan
[ App - Entwicklung ]

K.S.

Antworten
  • Forum-Beiträge: 2.492

05.07.2016, 15:22:24 via Website

Okay das Beispiel mit dem Eimer trifft es jetzt nicht so super aber ansonsten stimme ich dir zu :P

Du musst der view ja sagen welche View es jetzt ist. Irgendeine View auf dem Bildschirm soll ja gefüllt werden. Wie soll das Programm wissen, welche gemeint ist. Diese Zuweisung fehlt dir.

— geändert am 05.07.2016, 15:23:11

K.S.

Antworten
  • Forum-Beiträge: 2.909

05.07.2016, 15:28:15 via Website

ja ich weis , der Eimer war nicht so der Brüller :-)

@K.S

Schau mal in dem Buch , welches du verwendest (Copy & Paste) auf Seite 114 - da steht noch mehr drin
(Google hat es mit verraten)

— geändert am 05.07.2016, 15:30:36

Liebe Grüße - Stefan
[ App - Entwicklung ]

K.S.

Antworten
  • Forum-Beiträge: 7

05.07.2016, 15:34:34 via Website

Dannke swa00,

ich war auch wirklich doof :D

ich hab echt vergessen die view zu initialisieren :D haha

hab nun die zeile

view = new ImageView(container.getContext())

noch hinzugefügt und zack nun läufts :D

Antworten
  • Forum-Beiträge: 7

05.07.2016, 15:38:12 via Website

Danke auch an alle anderen :D

hatte echt ein brett vorm kopf ^-^

Antworten
  • Forum-Beiträge: 2.909

05.07.2016, 15:47:44 via Website

Keine Ursache, Rechnung ist schon ausgedruckt ..... :-)

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.183

05.07.2016, 17:48:42 via Website

Hallo K.S.
Wir löschen Threads grundsätzlich nicht, wenn diese hier nicht gegen die AGB o.ä. verstoßen.
Vielleicht hilft man ja damit anderen, welche das selbe Problem haben.
Da du deinen Thread ja schon auf Beantwortet gesetzt hast, musst du auch nichts weiter tun ;)

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten

Empfohlene Artikel