2017-02-22 48 views
-2

Я делал список любимых действий в андроиде, который использует arraylist в качестве места для хранения, но когда я запускал событие нажатием кнопки, наступает ошибка нулевого указателя. Почему это так...??? Вот код моей деятельности в кинематике, где нажата кнопка.Зачем нужна эта ошибка нулевого указателя?

public class Kinematics extends AppCompatActivity { 
private DrawerLayout drawerLayout; 
private NavigationView navigationView; 
private ActionBarDrawerToggle phy_law_toggel; 
private Toolbar toolbar; 
private WebView webView; 
private ScrollView scrollview; 
private FloatingActionButton fab; 
private ImageButton fav; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    final Favouritepage favr = new Favouritepage(); 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_kinematics); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.phy_lawtoolbar); 
    setSupportActionBar(toolbar); 
    setTitle(R.string.Kinematics); 
    drawerLayout = (DrawerLayout) findViewById(R.id.phy_draw); 
    navigationView = (NavigationView) findViewById(R.id.nav_view_phy); 

    phy_law_toggel = new ActionBarDrawerToggle(this,drawerLayout,R.string.open, R.string.Close); 
    drawerLayout.addDrawerListener(phy_law_toggel); 
    toolbar = (Toolbar) findViewById(R.id.phy_lawtoolbar); 
    setSupportActionBar(toolbar); 
    phy_law_toggel.syncState(); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    navigationView.setItemIconTintList(null); 
    webView = (WebView) findViewById(R.id.phy_law_web); 
    fav = (ImageButton) findViewById(R.id.fav); 
    webView.getSettings().setJavaScriptEnabled(true); 
    webView.getSettings().setBuiltInZoomControls(true); 
    webView.getSettings().setSupportZoom(true); 
    final String kine = this.getClass().getSimpleName(); 
    webView.getSettings().setDisplayZoomControls(true); 
    webView.loadUrl("file:///android_asset/mathscribe/Kinematics.html"); 
    fab = (FloatingActionButton) findViewById(R.id.fab); 
    scrollview = (ScrollView) findViewById(R.id.scroll); 

    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      webView.scrollTo(0, 0); 
     } 
    }); 
    fav.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      favr.mfavlist.add(kine); 
     } 
    }); 


} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if (phy_law_toggel.onOptionsItemSelected(item)) { 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
}} 

Здесь я делаю объект моего класса FavoritePage и пытаюсь сохранить элемент в ArrayList из FavoritePage.

Вот мой FavoritePage класс

public class Favouritepage extends AppCompatActivity { 

public ArrayList<String> mfavlist; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_favouritepage); 
    mfavlist = new ArrayList<String>(); 

}} 

А вот XML кинематики,

<android.support.v4.widget.DrawerLayout         
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/phy_draw" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:fitsSystemWindows="true" 
tools:context="com.example.alpit.formula2.Kinematics"> 


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

    <android.support.v7.widget.Toolbar 
     android:id="@+id/phy_lawtoolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:background="?attr/colorPrimary" 
     app:popupTheme="@style/AppTheme.NoActionBar.PopupOverlay"> 


    </android.support.v7.widget.Toolbar> 


    <WebView 
     android:id="@+id/phy_law_web" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentEnd="true" 
     android:layout_alignParentStart="true" 
     android:layout_below="@+id/phy_lawtoolbar"></WebView> 

    <android.support.design.widget.FloatingActionButton 
     android:id="@+id/fab" 
     android:layout_width="56dp" 
     android:layout_height="56dp" 
     android:layout_alignBottom="@+id/phy_law_web" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentEnd="true" 
     android:layout_gravity="bottom|end" 
     android:layout_marginBottom="43dp" 
     android:layout_marginEnd="30dp" 
     android:src="@drawable/fabss" 
     app:backgroundTint="#F57F17"> 

</android.support.design.widget.FloatingActionButton> 

    <ImageButton 
     android:id="@+id/fav" 
     android:layout_width="80dp" 
     android:layout_height="80dp" 
     android:layout_above="@+id/phy_law_web" 
     android:layout_alignParentEnd="true" 
     android:background="@color/colorPrimary" 
     android:src="@drawable/fav" /> 


</RelativeLayout> 


<android.support.design.widget.NavigationView 
    android:id="@+id/nav_view_phy" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:background="#FFAB40" 
    app:menu="@menu/navigation_menu" 
    app:theme="@style/NavigationTheme" /> 

crashlog

E/AndroidRuntime: FATAL EXCEPTION: main 
       Process: com.example.alpit.formula2, PID: 22744 
       java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.util.ArrayList.add(java.lang.Object)' on a null object reference 
        at com.example.alpit.formula2.Kinematics$2.onClick(Kinematics.java:64) 
        at android.view.View.performClick(View.java:4802) 
        at android.view.View$PerformClick.run(View.java:20102) 
        at android.os.Handler.handleCallback(Handler.java:810) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loop(Looper.java:189) 
        at android.app.ActivityThread.main(ActivityThread.java:5529) 
        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:950) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:745) 
+0

Пожалуйста, сообщайте отчеты об авариях или журналы – Killer

+0

@ Хенри, я так не думаю, что, возможно, мне не хватает какой-либо концепции. Просмотрите мой код. –

+0

@AlpitAnand Да, ваши переменные равны нулю, поэтому, пожалуйста, отлаживайте свой собственный код, чтобы увидеть «как его исправить». Много вопросов об нулевых переменных, тем не менее, никто не находит времени, чтобы понять, как его исправить –

ответ

1

Добавьте эту строку после setContentView в вашейКинематическая.

ArrayList<String> mfavlist = new ArrayList<String>(); 

редактировать эта строка кода

fav.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     mfavlist.add(kine); 
    } 
}); 
+0

Спасибо за ответ, но мы добавляем название деятельности в «Избранный список», я хочу, чтобы мой ArrayList находился в «ИзбранномList», вместо того, чтобы иметь локальный локатор в каждом действии. –

+0

Вы не можете получить доступ к своему архаристу от одного вида деятельности до другой деятельности –

+0

Есть 2 способа: передать ваш аррайалист в Кинематическую деятельность с намерением ИЛИ создать класс приложения и заменить там архариста. –

0

Вот мой FavoritePage класс

public class Favouritepage extends AppCompatActivity { 

... Между тем в своем другом классе ...

final Favouritepage favr = new Favouritepage(); 

Никогда никогдаnew класс активности (потому что onCreate никогда не вызывается, поэтому список является нулевым)

В принципе, я не думаю, что FavouritePage должна распространяться активность на всех.

Узнайте больше о POJO классов

public class Favouritepage { 

    public ArrayList<String> mfavlist = new ArrayList<String>(); 

    public Favouritepage() { 
     // Empty constructor 
    } 
} 

Или, если это необходимо действительно должен быть класс Activity, вам придется найти другой способ «доля», что список между различными видами деятельности.

+0

Тем не менее, тот же нулевой указатель, спасибо за ответ, хотя. –

+0

Не должно быть. Как я уже сказал, 'onCreate' никогда не называется. В вашем коде 'mfavlist = new ArrayList ();' никогда не запускается. –