2014-03-24 17 views
0

我每次运行该代码的Java的Android:运行时错误使用Java的Android(Eclipse中):

package com.example.basiccalculator; 

import android.os.Bundle; 


public class MainActivity extends Activity 

{ 

LinearLayout layout1; 
TextView text1; 
EditText number1text; 
EditText number2text; 
Button multiplyButton; 
Button divideButton; 
Button subtractButton; 
Button addButton; 
TextView answerText; 

@Override 
protected void onCreate(Bundle savedInstanceState) 

{ 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    layout1 = new LinearLayout(this); 
    text1 = new TextView(this); 
    number1text = new EditText(this); 
    number2text = new EditText(this); 
    multiplyButton = new Button(this); 
    answerText = new TextView(this); 
    divideButton = new Button(this); 

    layout1.setOrientation(LinearLayout.VERTICAL); 
    layout1.setGravity(Gravity.CENTER_HORIZONTAL); 
    answerText.setWidth(150); 
    answerText.setGravity(Gravity.CENTER_HORIZONTAL); 

    answerText.setTextSize(TypedValue.COMPLEX_UNIT_SP,20); 
    number1text.setInputType(InputType.TYPE_CLASS_NUMBER); 
    number2text.setInputType(InputType.TYPE_CLASS_NUMBER); 


    multiplyButton.setOnClickListener(multiplyClicked); 
    divideButton.setOnClickListener(divideClicked); 
    subtractButton.setOnClickListener(subtractClicked); 
    addButton.setOnClickListener(addClicked); 

    answerText.setText("0"); 
    addButton.setText("+"); 
    subtractButton.setText("-"); 
    multiplyButton.setText("X"); 
    divideButton.setText("/"); 

    layout1.addView(number1text); 
    layout1.addView(number2text); 
    layout1.addView(multiplyButton); 
    layout1.addView(answerText); 
    layout1.addView(divideButton); 
    layout1.addView(addButton); 
    layout1.addView(subtractButton); 
    setContentView(layout1); 

    number1text.setLayoutParams(new LinearLayout.LayoutParams(550,200)); 
    number2text.setLayoutParams(new LinearLayout.LayoutParams(550,200)); 
    multiplyButton.setLayoutParams(new LinearLayout.LayoutParams(250,250)); 
    divideButton.setLayoutParams(new LinearLayout.LayoutParams(250, 250)); 
    addButton.setLayoutParams(new LinearLayout.LayoutParams(250,250)); 
    subtractButton.setLayoutParams(new LinearLayout.LayoutParams(250, 250)); 


    //Catch methods 

} 

private OnClickListener multiplyClicked = new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     String firststring = number1text.getText().toString(); 
     String secondstring = number1text.getText().toString(); 
     double firstnumber = Double.parseDouble(firststring); 
     double secondnumber = Double.parseDouble(secondstring); 
     double result = firstnumber * secondnumber; 
     String resultString = String.valueOf(result); 
     answerText.setText(resultString); 

    } 


}; 


private OnClickListener divideClicked = new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     String firststring = number1text.getText().toString(); 
     String secondstring = number1text.getText().toString(); 
     double firstnumber = Double.parseDouble(firststring); 
     double secondnumber = Double.parseDouble(secondstring); 
     double result = firstnumber/secondnumber; 
     String resultString = String.valueOf(result); 
     answerText.setText(resultString); 

    } 


}; 

private OnClickListener subtractClicked = new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     String firststring = number1text.getText().toString(); 
     String secondstring = number1text.getText().toString(); 
     double firstnumber = Double.parseDouble(firststring); 
     double secondnumber = Double.parseDouble(secondstring); 
     double result = firstnumber - secondnumber; 
     String resultString = String.valueOf(result); 
     answerText.setText(resultString); 

    } 


}; 

private OnClickListener addClicked = new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     String firststring = number1text.getText().toString(); 
     String secondstring = number1text.getText().toString(); 
     double firstnumber = Double.parseDouble(firststring); 
     double secondnumber = Double.parseDouble(secondstring); 
     double result = firstnumber + secondnumber; 
     String resultString = String.valueOf(result); 
     answerText.setText(resultString); 

    } 


}; 





} 

我一直在我的控制台得到这些运行时错误:

- 03-24 15:27:06.300: D/dalvikvm(913): Not late-enabling CheckJNI (already on) 

- 03-24 15:27:10.110: D/AndroidRuntime(913): Shutting down VM 
- 03-24 15:27:10.110: W/dalvikvm(913): threadid=1: thread exiting with uncaught exception (group=0xb1a18b90) 
- 03-24 15:27:10.260: D/dalvikvm(913): GC_FOR_ALLOC freed 110K, 6% free 3272K/3452K, paused 62ms, total 69ms 
- 03-24 15:27:10.280: E/AndroidRuntime(913): FATAL EXCEPTION: main 
- 03-24 15:27:10.280: E/AndroidRuntime(913): Process: com.example.basiccalculator, PID: 913 
- 03-24 15:27:10.280: E/AndroidRuntime(913): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.basiccalculator/com.example.basiccalculator.MainActivity}: - java.lang.NullPointerException 
- 03-24 15:27:10.280: E/AndroidRuntime(913): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2176) 
- 03-24 15:27:10.280: E/AndroidRuntime(913): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226) 
- 03-24 15:27:10.280: E/AndroidRuntime(913): at android.app.ActivityThread.access$700(ActivityThread.java:135) 
- 03-24 15:27:10.280: E/AndroidRuntime(913): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397) 
- 03-24 15:27:10.280: E/AndroidRuntime(913): at android.os.Handler.dispatchMessage(Handler.java:102) 
- 03-24 15:27:10.280: E/AndroidRuntime(913): at android.os.Looper.loop(Looper.java:137) 
- 03-24 15:27:10.280: E/AndroidRuntime(913): at android.app.ActivityThread.main(ActivityThread.java:4998) 
- 03-24 15:27:10.280: E/AndroidRuntime(913): at java.lang.reflect.Method.invokeNative(Native Method) 
- 03-24 15:27:10.280: E/AndroidRuntime(913): at java.lang.reflect.Method.invoke(Method.java:515) 
- 03-24 15:27:10.280: E/AndroidRuntime(913): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777) 
- 03-24 15:27:10.280: E/AndroidRuntime(913): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593) 
- 03-24 15:27:10.280: E/AndroidRuntime(913): at dalvik.system.NativeStart.main(Native Method) 
- 03-24 15:27:10.280: E/AndroidRuntime(913): Caused by: java.lang.NullPointerException 
- 03-24 15:27:10.280: E/AndroidRuntime(913): at com.example.basiccalculator.MainActivity.onCreate(MainActivity.java:60) 
- 03-24 15:27:10.280: E/AndroidRuntime(913): at android.app.Activity.performCreate(Activity.java:5243) 
- 03-24 15:27:10.280: E/AndroidRuntime(913): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
- 03-24 15:27:10.280: E/AndroidRuntime(913): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140) 
- 03-24 15:27:10.280: E/AndroidRuntime(913): ... 11 more 

但当我删除catch方法时,它似乎运行良好。有谁知道为什么我不断收到这些运行时错误?

回答

0

看起来你并没有在这里设置OnClickListener之前初始化subtractButton

subtractButton.setOnClickListener(subtractClicked); 

同为addButton

==>呼吁未初始化对象的方法将导致NullPointerException (NPE)

BTW:你可能确实希望使用的布局XML。我想知道为什么你从未使用findViewById方法查找R.layout.activity_main中的元素?

+0

但是我在第35行和第36行初始化了对象(addClicked和subtractClicked)。 – SS149

+0

你宣布字段'substractClickClicked'和'addClicked' - 目前为止很好 - 但是你没有初始化它们。您需要像使用其他按钮'divideButton = new Button(this);'...一样进行操作,或者更好地使用layout xml并使用'findViewById'方法查找按钮。 – donfuxx

+0

现在问题解决了吗? – donfuxx

0

使用关键字引用到刚刚引用包含类。如上所述,通过使用findViewById来初始化你的UI元素的标准方式就像这样, subtractButton = (Button)findViewById(R.your_layout.buttonID);。 然后,您将对每个正在使用的其他UI元素使用相同的语法。

如果你想,你可以定义一个OnClickHandler为每个按钮的使用onClick="myBtnHandler"一个属性。然后,你会像这样在你的代码中使用相应的方法。

public void btnHandler(View v) { int btnId = v.getId(); switch(btnId) { case R.id.subtractBtn: { //Code Goes Here... } } }

其他按钮将进入交换机内部。此设置将有助于保持您的代码更有条理。