2015-09-07 85 views
-1

我是新來的android開發,並試圖做一個簡單的計算器應用程序。我改變的最後一件事是嘗試將兩個字符串連接成一個,並在EditText中顯示新字符串。當我在Android Studio中查看時,我的項目中沒有任何錯誤,但是當我在手機上運行應用程序時,它停止工作。這是電話問題還是...?Android工作室沒有錯誤,但應用程序崩潰

package com.example.jeff.calculator; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 

public class MainActivity extends AppCompatActivity { 
    double total = 0; 
    double transaction = 0; 
    String Back = ""; 
    String currentString = ""; 
    String transactionString = ""; 
    EditText calcInput = (EditText) findViewById(R.id.EtCalc); 

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

     buttonSetup(); 
    } 

    private void concatenation() { 
     transactionString = transactionString + currentString; 
     calcInput.setText(String.valueOf(transactionString)); 
    } 

    private void buttonSetup() { 

     Button button0 = (Button) findViewById(R.id.Btn0); 
     Button button1 = (Button) findViewById(R.id.Btn1); 
     Button button2 = (Button) findViewById(R.id.Btn2); 
     Button button3 = (Button) findViewById(R.id.Btn3); 
     Button button4 = (Button) findViewById(R.id.Btn4); 
     Button button5 = (Button) findViewById(R.id.Btn5); 
     Button button6 = (Button) findViewById(R.id.Btn6); 
     Button button7 = (Button) findViewById(R.id.Btn7); 
     Button button8 = (Button) findViewById(R.id.Btn8); 
     Button button9 = (Button) findViewById(R.id.Btn9); 

     button0.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       currentString = "0"; 
       calcInput.setText(String.valueOf(transactionString)); 
      } 
     }); 
     button1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       currentString = "1"; 
       concatenation(); 
      } 
     }); 
     button2.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       currentString = "2"; 
       concatenation(); 
      } 
     }); 
     button3.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       currentString = "3"; 
       concatenation(); 
      } 
     }); 
     button4.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       currentString = "4"; 
       concatenation(); 
      } 
     }); 
     button5.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       currentString = "5"; 
       concatenation(); 
      } 
     }); 
     button6.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       currentString = "6"; 
       concatenation(); 
      } 
     }); 
     button7.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       currentString = "7"; 
       concatenation(); 
      } 
     }); 
     button8.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       currentString = "8"; 
       concatenation(); 
      } 
     }); 
     button9.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       currentString = "9"; 
       concatenation(); 
      } 
     }); 
     // (EditText) inputTxt = (EditText) findViewById(R.id.input); 

// Store EditText in Variable 

     // String str = inputTxt.getText().toString(); 
    } 

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

logcat的

09-07 23:54:12.649 22823-22823/com.example.jeff.calculator I/art﹕ Late-enabling -Xcheck:jni 
09-07 23:54:12.718 22823-22823/com.example.jeff.calculator D/AndroidRuntime﹕ Shutting down VM 
09-07 23:54:12.719 22823-22823/com.example.jeff.calculator E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.example.jeff.calculator, PID: 22823 
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.jeff.calculator/com.example.jeff.calculator.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.Window.findViewById(int)' on a null object reference 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2290) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2442) 
      at android.app.ActivityThread.access$800(ActivityThread.java:156) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1351) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:211) 
      at android.app.ActivityThread.main(ActivityThread.java:5373) 
      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:1020) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815) 
    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.Window.findViewById(int)' on a null object reference 
      at android.app.Activity.findViewById(Activity.java:2072) 
      at com.example.jeff.calculator.MainActivity.<init>(MainActivity.java:22) 
      at java.lang.reflect.Constructor.newInstance(Native Method) 
      at java.lang.Class.newInstance(Class.java:1606) 
      at android.app.Instrumentation.newActivity(Instrumentation.java:1066) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2280) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2442) 
            at android.app.ActivityThread.access$800(ActivityThread.java:156) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1351) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:211) 
            at android.app.ActivityThread.main(ActivityThread.java:5373) 
            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:1020) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815) 
你是從 Activity繼承直到 super.onCreate()

回答

4

不要調用方法被調用,除非特意告訴否則。

此外,您不能撥打findViewById(),直到您致電setContentView(),因爲沒有窗口小部件可供查找。

替換:

EditText calcInput = (EditText) findViewById(R.id.EtCalc); 

有:

EditText calcInput; 

,並添加:

calcInput = (EditText) findViewById(R.id.EtCalc); 

您在onCreate()調用setContentView()後。

+0

非常感謝你。出於好奇,setContentView()和onCreate()是什麼意思? – Dzyuv001

+1

@ Dzyuv001:'onCreate()'是進入你的活動的入口 - 或多或少,它是第一個被調用的方法。 'setContentView()'說:「嘿,Android,這是我想要作爲我的基本用戶界面的活動」。 – CommonsWare

+0

'onCreate()'是android'Activity'生命週期中的一個方法。當'Activity'創建時調用它。 - 在這裏閱讀更多:http://developer.android.com/training/basics/activity-lifecycle/index.html – Mauker

1

你要定義一個變量

EditText calcInput = (EditText) findViewById(R.id.EtCalc); 

這意味着,當類被初始化,您正試圖找到一個null窗口的元素。

你不能這樣做。

只需使用:

EditText calcInput; 

然後初始化你onCreate方法的變量。

喜歡的東西:

public class MainActivity extends AppCompatActivity { 
    //... 
    EditText calcInput; 

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

     buttonSetup(); 

     calcInput = (EditText) findViewById(R.id.EtCalc); 
    } 

} 
0

你必須移動這條線:

EditText calcInput = (EditText) findViewById(R.id.EtCalc); 

以下線以下:

setContentView(R.layout.activity_main); 
相關問題