2014-01-05 164 views
-3

我今天開始爲android編程一個基本的溫度轉換應用程序(仍然是初學者),而且我似乎正在得到NullPointerException,我無法弄清楚是什麼導致了它。我試過註釋掉可能導致錯誤的代碼部分,但沒有運氣。當我在Android設備上通過ADB運行應用程序時,應用程序在啓動時崩潰。空指針異常 - Android

這是一個正在進行的工作,所以請忽略任何未完成的部分(除非這是導致問題的原因)。下面是代碼:

import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 
import android.widget.ArrayAdapter; 
import android.widget.Spinner; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.RadioButton; 
import android.widget.Toast; 

public class MainActivity extends Activity { 

    private String array_spinner1[]; 
    private String array_spinner2[]; 
    private EditText input1; 
    private EditText input2; 
    Spinner topSpinner; 
    Spinner bottomSpinner; 
    String topSpinnerVal; 
    String bottomSpinnerVal; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     topSpinner = (Spinner) findViewById(R.id.input1Sp); 
     bottomSpinner = (Spinner) findViewById(R.id.input2Sp); 
     topSpinnerVal = topSpinner.getSelectedItem().toString(); 
     bottomSpinnerVal = bottomSpinner.getSelectedItem().toString(); 
     array_spinner1=new String[3]; 
     array_spinner1[0]="Celsius"; 
     array_spinner1[1]="Fahrenheit"; 
     array_spinner1[2]="Kelvin"; 
     array_spinner2=new String[3]; 
     array_spinner2[0]="Celsius"; 
     array_spinner2[1]="Fahrenheit"; 
     array_spinner2[2]="Kelvin"; 
     ArrayAdapter adapter1 = new ArrayAdapter(this, 
     android.R.layout.simple_spinner_item, array_spinner1); 
     ArrayAdapter adapter2 = new ArrayAdapter(this, 
     android.R.layout.simple_spinner_item, array_spinner2); 
     topSpinner.setAdapter(adapter1); 
     bottomSpinner.setAdapter(adapter2); 
     input1 = (EditText) findViewById(R.id.input1TB); 
     input1 = (EditText) findViewById(R.id.input2TB); 
    } 

    public void onClick(View button) { 
     Double valTop = Double.parseDouble(input1.getText().toString()); 
     Double valBottom = Double.parseDouble(input2.getText().toString()); 
     switch (button.getId()) { 
     case R.id.topToBottomBt: 
      if (input1.getText().length() == 0){ 
       Toast.makeText(this, "Requested conversion is empty", Toast.LENGTH_LONG).show(); 
      return; 
      } 
      if (topSpinnerVal.equals("Celsius")) { 
       if (bottomSpinnerVal.equals("Celsius")) { 

       } 
      } 
     case R.id.bottomToTopBt: 

     } 
    } 

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

} 

的logcat的日誌在Eclipse中說以下內容:

所有這裏面 onCreate
01-05 00:01:18.687: D/AndroidRuntime(22472): Shutting down VM 
01-05 00:01:18.687: W/dalvikvm(22472): threadid=1: thread exiting with uncaught exception (group=0x41e23700) 
01-05 00:01:18.687: E/AndroidRuntime(22472): FATAL EXCEPTION: main 
01-05 00:01:18.687: E/AndroidRuntime(22472): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tumblr.nocturnalparasites.temperatureconversion/com.tumblr.nocturnalparasites.temperatureconversion.MainActivity}: java.lang.NullPointerException 
01-05 00:01:18.687: E/AndroidRuntime(22472): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2339) 
01-05 00:01:18.687: E/AndroidRuntime(22472): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2389) 
01-05 00:01:18.687: E/AndroidRuntime(22472): at android.app.ActivityThread.access$600(ActivityThread.java:153) 
01-05 00:01:18.687: E/AndroidRuntime(22472): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1269) 
01-05 00:01:18.687: E/AndroidRuntime(22472): at android.os.Handler.dispatchMessage(Handler.java:99) 
01-05 00:01:18.687: E/AndroidRuntime(22472): at android.os.Looper.loop(Looper.java:137) 
01-05 00:01:18.687: E/AndroidRuntime(22472): at android.app.ActivityThread.main(ActivityThread.java:5287) 
01-05 00:01:18.687: E/AndroidRuntime(22472): at java.lang.reflect.Method.invokeNative(Native Method) 
01-05 00:01:18.687: E/AndroidRuntime(22472): at java.lang.reflect.Method.invoke(Method.java:525) 
01-05 00:01:18.687: E/AndroidRuntime(22472): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:738) 
01-05 00:01:18.687: E/AndroidRuntime(22472): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554) 
01-05 00:01:18.687: E/AndroidRuntime(22472): at dalvik.system.NativeStart.main(Native Method) 
01-05 00:01:18.687: E/AndroidRuntime(22472): Caused by: java.lang.NullPointerException 
01-05 00:01:18.687: E/AndroidRuntime(22472): at com.tumblr.nocturnalparasites.temperatureconversion.MainActivity.onCreate(MainActivity.java:30) 
01-05 00:01:18.687: E/AndroidRuntime(22472): at android.app.Activity.performCreate(Activity.java:5201) 
01-05 00:01:18.687: E/AndroidRuntime(22472): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
01-05 00:01:18.687: E/AndroidRuntime(22472): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2293) 
01-05 00:01:18.687: E/AndroidRuntime(22472): ... 11 more 
+2

並在此之後*它會告訴你到底是什麼問題。 –

+1

請發佈COMPLETE LogCat輸出。 –

+1

@BrianRoach它在任何地方都沒有行號。 –

回答

1

我修復了這個問題。這是與topSpinnerVal和bottomSpinnerVal字符串;在我爲它們分配適配器之前,我試圖從紡紗廠獲得價值。我將字符串賦值移至了onClick方法,該方法將在onCreate方法之後運行。

這裏是工作代碼:

import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 
import android.widget.ArrayAdapter; 
import android.widget.Spinner; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.RadioButton; 
import android.widget.Toast; 

public class MainActivity extends Activity { 

    private String array_spinner1[]; 
    private String array_spinner2[]; 
    private EditText input1; 
    private EditText input2; 
    Spinner topSpinner; 
    Spinner bottomSpinner; 
    String topSpinnerVal; 
    String bottomSpinnerVal; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     topSpinner = (Spinner) findViewById(R.id.input1Sp); 
     bottomSpinner = (Spinner) findViewById(R.id.input2Sp); 
     array_spinner1=new String[3]; 
     array_spinner1[0]="Celsius"; 
     array_spinner1[1]="Fahrenheit"; 
     array_spinner1[2]="Kelvin"; 
     array_spinner2=new String[3]; 
     array_spinner2[0]="Celsius"; 
     array_spinner2[1]="Fahrenheit"; 
     array_spinner2[2]="Kelvin"; 
     ArrayAdapter adapter1 = new ArrayAdapter(this, 
     android.R.layout.simple_spinner_item, array_spinner1); 
     ArrayAdapter adapter2 = new ArrayAdapter(this, 
     android.R.layout.simple_spinner_item, array_spinner2); 
     topSpinner.setAdapter(adapter1); 
     bottomSpinner.setAdapter(adapter2); 
     input1 = (EditText) findViewById(R.id.input1TB); 
     input2 = (EditText) findViewById(R.id.input2TB); 
    } 

    public void onClick(View button) { 
     topSpinnerVal = topSpinner.getSelectedItem().toString(); 
     bottomSpinnerVal = bottomSpinner.getSelectedItem().toString(); 
     Double valTop = Double.parseDouble(input1.getText().toString()); 
     Double valBottom = Double.parseDouble(input2.getText().toString()); 
     switch (button.getId()) { 
     case R.id.topToBottomBt: 
      if (input1.getText().length() == 0){ 
       Toast.makeText(this, "Requested conversion is empty", Toast.LENGTH_LONG).show(); 
      return; 
      } 
      if (topSpinnerVal.equals("Celsius")) { 
       if (bottomSpinnerVal.equals("Celsius")) { 

       } 
      } 
     case R.id.bottomToTopBt: 

     } 
    } 

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

} 

感謝您給回答用戶。

1

移動的setContentView

Spinner topSpinner; 
Spinner bottomSpinner; 
String topSpinnerVal; 
String bottomSpinnerVal; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 
topSpinner = (Spinner) findViewById(R.id.input1Sp); 
bottomSpinner = (Spinner) findViewById(R.id.input2Sp); 
topSpinnerVal = topSpinner.getSelectedItem().toString(); 
bottomSpinnerVal = bottomSpinner.getSelectedItem().toString(); 

findViewById查找與id的視圖在目前的膨脹佈局中提到。所以首先你需要將佈局的內容設置爲活動,然後初始化你的視圖。

編輯:

你也有

Spinner s1 = (Spinner) findViewById(R.id.input1Sp); 
Spinner s2 = (Spinner) findViewById(R.id.input2Sp); 

爲什麼你需要以上時,你已經擁有以下

topSpinner = (Spinner) findViewById(R.id.input1Sp); 
bottomSpinner = (Spinner) findViewById(R.id.input2Sp); 

適配器設置爲topSpinnerbottomSpinner

還有

if (topSpinnerVal == "Celsius") { 

應該

if (topSpinnerVal.equals("Celsius")) { 

使用.equals比較字符串。同樣使用.equals來比較其他地方的字符串

+0

@ user2974881您可以按照上面的建議進行操作,因爲它被聲明爲實例變量。 – Raghunandan

+0

我刪除了評論。在我發佈評論之前,我沒有注意到onCreate之外的定義。 –

+0

這並沒有幫助。它仍然崩潰,並給我同樣的錯誤。 –

0

首先,看看@Raghunandan的建議,所有你需要的。 然後,請檢查您的logcat來檢查線路發現什麼看法正在產生的錯誤,或做一步步的調試(如果你不知道怎麼了,按照這個月食的幫助頁面:http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Ftasks%2Ftask-stepping.htm

一個或多個您視圖正在使其崩潰,因爲在使用視圖之前,您沒有在findViewById後檢查它們是否爲空。

當您找到產生錯誤的視圖時,請在您的佈局中查找它,正在加載用於測試的設備大小和配置,並確保id在那裏(如果該ID在項目中的任何文件中,Eclipse都不會標記錯誤,但如果它不在正確的文件中,你會有這個運行時錯誤)