java - Android奇怪的ComponentInfo NullPointerException

标签 java android model-view-controller nullpointerexception

所以我试图为 Android 制作一个非常简单的 MVC 应用程序。 Observer 正确实现并且 Observable 扩展正确,所以一切都很顺利。但是,每当我运行该应用程序时,我都会收到 NullPointerException。谁能弄清楚为什么吗?这一定是我缺少的一些简单的东西。

activity_main.xml

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/nameView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:text="@string/hello_world"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <Button
            android:id="@+id/nameSet"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:text="@string/change"
            android:layout_marginTop="20dp"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <TextView
            android:id="@+id/storeView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:text="@string/hello_world"
            android:layout_marginTop="80dp"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <Button
            android:id="@+id/storeSet"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:text="@string/change"
            android:layout_marginTop="100dp"
            android:textAppearance="?android:attr/textAppearanceMedium" />

    </RelativeLayout>

</ScrollView>

MainActivity.java

public class MainActivity extends Activity implements Observer{
    private ClipboardModel model;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.model = new ClipboardModel();
        System.out.println(this.model.getName());
        this.model.addObserver(this);
        //redraw();
        setContentView(R.layout.activity_main);
    }

    @Override
    public void update(Observable arg0, Object arg1) {
        redraw();
    }

    private void redraw(){
        TextView nameView = (TextView)findViewById(R.id.nameView);
        nameView.setText(this.model.getName());
        TextView storeView = (TextView)findViewById(R.id.storeView);
        storeView.setText(this.model.getStore());
    }

    /*
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }*/

}

ClipboardModel.java

public class ClipboardModel extends Observable{

    private String name;

    private String store;

    private int[] a;
    private int[] b;
    private int[] c;
    private int[] d;
    private int[] e;
    private int[] g;
    private int[] h;

    private int[] f;
    private int[] w;
    private int[] s;

    private int[] l;
    private int[] p;
    private int[] v;
    private int[] x;

    private int ldw;
    private int pai;
    private int pep;
    private int ali;
    private int cpp;

    private int gps;
    private int rsn;
    private int fuel;
    private int xm;
    private int cs;

    /**
     * Constructor for ClipboardModel
     */
    public ClipboardModel(){
        this.a = new int[3];
        this.b = new int[3];
        this.c = new int[3];
        this.d = new int[3];
        this.e = new int[3];
        this.g = new int[3];
        this.h = new int[3];

        this.f = new int[3];
        this.w = new int[3];
        this.s = new int[3];

        this.l = new int[3];
        this.p = new int[3];
        this.v = new int[3];
        this.x = new int[3];

        this.ldw = 0;
        this.pai = 0;
        this.pep = 0;
        this.ali = 0;
        this.cpp = 0;

        this.gps = 0;
        this.rsn = 0;
        this.fuel = 0;
        this.xm = 0;
        this.cs = 0;

        this.name = "Name";
        this.store = "Store";
    }

    /**
     * Add a car to the appropriate array
     * @param type - Category of car
     * @param clean - whether or not the car is clean
     */
    public void addCar(String type, boolean clean){
        if(type.equals("a")){
            this.a[0]++;
            if(clean)
                this.a[1]++;
            else
                this.a[2]++;
        }
        else if(type.equals("b")){
            this.b[0]++;
            if(clean)
                this.b[1]++;
            else
                this.b[2]++;
        }

        else if(type.equals("c")){
            this.c[0]++;
            if(clean)
                this.c[1]++;
            else
                this.c[2]++;
        }

        else if(type.equals("d")){
            this.d[0]++;
            if(clean)
                this.d[1]++;
            else
                this.d[2]++;
        }

        else if(type.equals("e")){
            this.e[0]++;
            if(clean)
                this.e[1]++;
            else
                this.e[2]++;
        }

        else if(type.equals("g")){
            this.g[0]++;
            if(clean)
                this.g[1]++;
            else
                this.g[2]++;
        }

        else if(type.equals("b")){
            this.h[0]++;
            if(clean)
                this.h[1]++;
            else
                this.h[2]++;
        }

        else if(type.equals("f")){
            this.f[0]++;
            if(clean)
                this.f[1]++;
            else
                this.f[2]++;
        }

        else if(type.equals("w")){
            this.w[0]++;
            if(clean)
                this.w[1]++;
            else
                this.w[2]++;
        }

        else if(type.equals("s")){
            this.s[0]++;
            if(clean)
                this.s[1]++;
            else
                this.s[2]++;
        }

        else if(type.equals("l")){
            this.l[0]++;
            if(clean)
                this.l[1]++;
            else
                this.l[2]++;
        }

        else if(type.equals("p")){
            this.p[0]++;
            if(clean)
                this.p[1]++;
            else
                this.p[2]++;
        }

        else if(type.equals("v")){
            this.v[0]++;
            if(clean)
                this.v[1]++;
            else
                this.v[2]++;
        }

        else if(type.equals("x")){
            this.x[0]++;
            if(clean)
                this.x[1]++;
            else
                this.x[2]++;
        }


        setChanged();
        notifyObservers();
    }

    /**
     * Remove a car from the appropriate array
     * @param type - Category of car
     * @param clean - Whether or not the car is clean
     */
    public void removeCar(String type, boolean clean){
        if(type.equals("a")){
            this.a[0]--;
            if(clean)
                this.a[1]--;
            else
                this.a[2]--;
        }
        else if(type.equals("b")){
            this.b[0]--;
            if(clean)
                this.b[1]--;
            else
                this.b[2]--;
        }

        else if(type.equals("c")){
            this.c[0]++;
            if(clean)
                this.c[1]--;
            else
                this.c[2]--;
        }

        else if(type.equals("d")){
            this.d[0]--;
            if(clean)
                this.d[1]--;
            else
                this.d[2]--;
        }

        else if(type.equals("e")){
            this.e[0]--;
            if(clean)
                this.e[1]--;
            else
                this.e[2]--;
        }

        else if(type.equals("g")){
            this.g[0]--;
            if(clean)
                this.g[1]--;
            else
                this.g[2]--;
        }

        else if(type.equals("b")){
            this.h[0]--;
            if(clean)
                this.h[1]--;
            else
                this.h[2]--;
        }

        else if(type.equals("f")){
            this.f[0]--;
            if(clean)
                this.f[1]--;
            else
                this.f[2]--;
        }

        else if(type.equals("w")){
            this.w[0]--;
            if(clean)
                this.w[1]--;
            else
                this.w[2]--;
        }

        else if(type.equals("s")){
            this.s[0]--;
            if(clean)
                this.s[1]--;
            else
                this.s[2]--;
        }

        else if(type.equals("l")){
            this.l[0]--;
            if(clean)
                this.l[1]--;
            else
                this.l[2]--;
        }

        else if(type.equals("p")){
            this.p[0]--;
            if(clean)
                this.p[1]--;
            else
                this.p[2]--;
        }

        else if(type.equals("v")){
            this.v[0]++;
            if(clean)
                this.v[1]--;
            else
                this.v[2]--;
        }

        else if(type.equals("x")){
            this.x[0]--;
            if(clean)
                this.x[1]--;
            else
                this.x[2]--;
        }


        setChanged();
        notifyObservers();
    }

    /**
     * Add a CSI 
     * @param type - type of CSI to add
     */
    public void addCSI(String type){
        if(type.equals("ldw"))
            this.ldw++;
        else if(type.equals("pai"))
            this.pai++;
        else if(type.equals("pep"))
            this.pep++;
        else if(type.equals("ali"))
            this.ali++;
        else if(type.equals("cpp"))
            this.cpp++;
        else if(type.equals("gps"))
            this.gps++;
        else if(type.equals("rsn"))
            this.rsn++;
        else if(type.equals("fuel"))
            this.fuel++;
        else if(type.equals("xm"))
            this.xm++;
        else if(type.equals("cs"))
            this.cs++;


        setChanged();
        notifyObservers();
    }

    /**
     * Remove a CSI
     * @param type - type of CSI to remove
     */
    public void removeCSI(String type){
        if(type.equals("ldw"))
            this.ldw--;
        else if(type.equals("pai"))
            this.pai--;
        else if(type.equals("pep"))
            this.pep--;
        else if(type.equals("ali"))
            this.ali--;
        else if(type.equals("cpp"))
            this.cpp--;
        else if(type.equals("gps"))
            this.gps--;
        else if(type.equals("rsn"))
            this.rsn--;
        else if(type.equals("fuel"))
            this.fuel--;
        else if(type.equals("xm"))
            this.xm--;
        else if(type.equals("cs"))
            this.cs--;


        setChanged();
        notifyObservers();
    }

    /**
     * Setter for name
     * @param name - Employee name
     */
    public void setName(String name){
        this.name = name;


        setChanged();
        notifyObservers();
    }

    /**
     * Setter for store
     * @param store - Store name
     */
    public void setStore(String store){
        this.store = store;

        setChanged();
        notifyObservers();
    }

    /**
     * Getter for name
     * @return this.name
     */
    public String getName(){
        return this.name;
    }

    /**
     * Getter for store
     * @return
     */
    public String getStore(){
        return this.store;
    }
}

该错误发生在 MainActivity.java 的 Method redraw() 中的第 29 行。第 28-29 行状态:

TextView nameView = (TextView)findViewById(R.id.nameView);
nameView.setText(this.model.getName());

任何解决错误的帮助将不胜感激!谢谢!

最佳答案

您的 nameviewnull 因为您在设置 setContentView() 之前尝试引用 Textview

试试这个

放置此

 this.model = new ClipboardModel();
    System.out.println(this.model.getName());
    this.model.addObserver(this);

setContentView(R.layout.activity_main);之后

关于java - Android奇怪的ComponentInfo NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16433050/

相关文章:

java - 尝试使用 Intent 时, Intent 在 ListView 中显示空指针

android - 在 Android 应用中嵌入广告?

spring - 使用 Spring 进行基于 JSP 的模板化

c# - 在登录后保护整个网站,即 "Authorize"所有 Controller 中的所有操作

java - OSGI 的 MVC Web 容器?

java - 如何使用 Apache HttpClient 发布非 JSON 请求?

java - 将 3D 数组写入二进制文件并将文件读回另一个 3D 数组 Java

java - 修改元模型的架构以更改/重命名列名称

android - EditText 的 setText() 在 onTextChanged 方法中不起作用

java - 如何在android中将Locale添加到DecimalFormatter