2015-08-21 2 views
-4

Я строю простую игру без игры, и я совершенно не знаю, почему она рушится. Это код:NullPointerException в простом приложении для Android

package com.de_velopers.idlegame;import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.TextView; 

public class MainActivity extends AppCompatActivity { 

    public int money; 
    public int upgrade_perClick_multiplier; 
    public int upgrade_perclick_level; 
    public int upgrade_perclick_cost; 
    public int upgrade_perclick_effect; 
    String stringmoney = String.valueOf(money); 
    TextView amount = (TextView)findViewById(R.id.moneyView); 
    String upgradeCostString = String.valueOf(upgrade_perclick_cost); 
    TextView upgradeCost = (TextView) findViewById(R.id.upgrade_pc_cost); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     upgrade_perclick_level = 1; 
     upgrade_perclick_cost = upgrade_perclick_level * 3; 

    } 

    @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); 
    } 


    public void increment(View view){ 
     if (upgrade_perclick_level < 2) { 
      money = money + 1; 
     }else money = money + upgrade_perClick_multiplier; 
     amount.setText(stringmoney); 

    } 

    public void upgrade_perclick_buy(View view) { 
     if (money >= upgrade_perclick_cost) { 
      money = money - upgrade_perclick_cost; 
      upgrade_perclick_level = upgrade_perclick_level + 1; 
      upgrade_perclick_cost = upgrade_perClick_multiplier * 4; 
      upgrade_perClick_multiplier = upgrade_perClick_multiplier * 2; 
      String upgradeAmnt = String.valueOf(upgrade_perClick_multiplier); 
      TextView upgradeEffect = (TextView)findViewById(R.id.clickAmnt); 
      upgradeEffect.setText(upgradeAmnt); 
      amount.setText(stringmoney); 
      upgradeCost.setText(upgradeCostString); 
     }else; 
    } 
} 

И ошибка я получаю это

08-22 00:50:14.968 32347-32347/com.de_velopers.idlegame E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.de_velopers.idlegame, PID: 32347 
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.de_velopers.idlegame/com.de_velopers.idlegame.MainActivity}: java.lang.NullPointerException 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233) 
      at android.app.ActivityThread.access$800(ActivityThread.java:135) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:136) 
      at android.app.ActivityThread.main(ActivityThread.java:5001) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
      at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.lang.NullPointerException 
      at android.app.Activity.findViewById(Activity.java:1921) 
      at com.de_velopers.idlegame.MainActivity.<init>(MainActivity.java:19) 
      at java.lang.Class.newInstanceImpl(Native Method) 
      at java.lang.Class.newInstance(Class.java:1208) 
      at android.app.Instrumentation.newActivity(Instrumentation.java:1061) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2101) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233) 
            at android.app.ActivityThread.access$800(ActivityThread.java:135) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:136) 
            at android.app.ActivityThread.main(ActivityThread.java:5001) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:515) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
            at dalvik.system.NativeStart.main(Native Method) 

Видимо это из-за линии 19, но линия 19 выглядит хорошо для меня ... сумма TextView = (TextView) findViewById (R.id.moneyView);

Редактировать: Могу ли я спросить, почему я занижен? Да, это было из-за того, что я что-то забыл, но почему это плохой пост? Не хватает деталей? Я слишком глуп, чтобы задавать вопросы?

+0

Не следует ли создавать приложение перед доступом к его представлениям? – 0rkan

ответ

8

Это TextView upgradeCost = (TextView) findViewById(R.id.upgrade_pc_cost); создает экземпляр поля в классе. Это означает, что код выполнен ПЕРЕД способом onCreate(), поэтому макет не установлен, и вы получаете NPE.

+1

Для борьбы с этим полем нужно указать поле TextView upgradeCost и установить его значение после onCreate(), чтобы избежать NPE. –

+0

ах спасибо. забыл об этом – 343N

0

Вы не можете использовать findViewById() в объявлении члена класса. он будет вызываться до установки макета. Вы должны позвонить это только после звонка setContentView().

TextView amount; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    TextView amount = (TextView)findViewById(R.id.moneyView) 
    ... 
} 
0

Вы не должны использовать findViewById до вызова setContentView.because до этого, ваш макет не завышены в вашей деятельности.

просто переместите все свое findViewById после setContentView, оно будет работать.

Обратите внимание на поле, которое вы указали с выражением, выражение всегда запускается до метода onCreate, выражение привязки поля вычисляется при создании экземпляра активности.

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