2015-01-17 2 views
1

Я постоянно получаю сообщение об ошибке при попытке запустить приложение для Android, сообщая мне, что есть ссылка на объект null. Я все еще новичок в андроиде и java, и я был бы очень признателен за любую помощь, которую я могу получить.android studio java.langNullPointerException null ссылка на объект

Вот logcat:

01-17 17:11:49.156 27778-27778/com.example.owner.sketchy D/AndroidRuntime﹕ Shutting down VM 
    --------- beginning of crash 
01-17 17:11:49.157 27778-27778/com.example.owner.sketchy E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.example.owner.sketchy, PID: 27778 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.owner.sketchy/com.example.owner.sketchy.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.widget.LinearLayout.getChildAt(int)' on a null object reference 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
      at android.app.ActivityThread.access$800(ActivityThread.java:144) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5221) 
      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:899) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.widget.LinearLayout.getChildAt(int)' on a null object reference 
      at com.example.owner.sketchy.MainActivity.onCreate(MainActivity.java:33) 
      at android.app.Activity.performCreate(Activity.java:5933) 
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
            at android.app.ActivityThread.access$800(ActivityThread.java:144) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:135) 
            at android.app.ActivityThread.main(ActivityThread.java:5221) 
            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:899) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 

и вот мой MainActivity.java:

package com.example.owner.sketchy; 

import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.ImageButton; 
import android.widget.LinearLayout; 

public class MainActivity extends ActionBarActivity { 


    private ImageButton currPaint; 
    private DrawingView drawView; 

    public void paintClicked(View view) { 
     if (view != currPaint) { 

      ImageButton imgView = (ImageButton) view; 
      String color = view.getTag().toString(); 
      imgView.setImageDrawable(getResources().getDrawable(R.drawable.paint_pressed)); 
      currPaint.setImageDrawable(getResources().getDrawable(R.drawable.paint)); 
      currPaint = (ImageButton) view; 
      drawView.setColor(color); 
     } 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     drawView = (DrawingView)findViewById(R.id.drawing); 
     LinearLayout paintLayout = (LinearLayout)findViewById(R.id.paint_colors); 
     currPaint = (ImageButton)paintLayout.getChildAt(0); 
    } 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

} 
+0

Вы уверены, что линейная раскладка, о которой вы говорите, существует? И что у него есть детское представление? –

+0

http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and-how-do-i-fix-it – user2864740

ответ

3

Ваш paintLayout имеет значение null, и ваша проблема: onCreate(). При переопределении методов из суперкласса вы всегда (чаще всего) вызываете метод из этого класса с помощью super.method(), чтобы обеспечить нормальную обработку.

Также у вас нет звонка на адрес setContentView(R.layout.your_layout). Поэтому не забудьте эти две строки:

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

    drawView = (DrawingView)findViewById(R.id.drawing); 
    LinearLayout paintLayout = (LinearLayout)findViewById(R.id.paint_colors); 
    currPaint = (ImageButton)paintLayout.getChildAt(0); 
} 
+0

Большое вам спасибо! Я был очень расстроен, потому что я не мог понять проблему, но это сработало! Я очень благодарен и рад узнать немного больше о java/android! –

1

Ваш метод onCreate() имеет два недостатка:

  1. Она не цепь суперкласса с super.onCreate(), который обычно самая первая строка в методе onCreate().

  2. Он не делает ничего, чтобы создать пользовательский интерфейс, такой как вызов setContentView().

Вы сбой, потому что findViewById() возвращается null, потому что у вас нет виджетов еще.

+0

Правильно. Для всех убедитесь, что перед использованием findViewById есть виджеты. –

Смежные вопросы