2013-08-27 4 views
0

Я получаю исключение NullPointerException на этой строке, если бы вы могли помочь мне разобраться, это было бы здорово!NullPointerException Ошибка разработки Android

double radius = Double.parseDouble(radiusEditText.getText().toString()); 

Вот весь код:

public class areacircle extends Activity { 
    TextView radiusTextView; 
    TextView areaTextView; 
    EditText radiusEditText; 
    Button areaButton; 
    EditText answerEditText; 

    @Override 
    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.areacircle); 

     areaButton = (Button) findViewById(R.id.areaButton); 
     answerEditText = (EditText) findViewById(R.id.answerEditText); 
     radiusEditText = (EditText) findViewById(R.id.radiusEditText); 


    } 
    double pi = 3.14; 
    double radius = Double.parseDouble(radiusEditText.getText().toString()); 
    double finalRadius = radius * radius *pi; 
    double area = Double.parseDouble(answerEditText.getText().toString()); 

    public void findarea(){ 

     answerEditText.setText(String.valueOf(finalRadius)); 


    } 
} 

areacircle.xml код:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/radiusTextView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/acirclefirstnumbtn" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:textSize="30sp" /> 

    <EditText 
     android:id="@+id/radiusEditText" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:ems="10" 
     android:hint="@string/radius" 
     android:inputType="numberDecimal" 
     android:textSize="30sp" > 

     <requestFocus /> 
    </EditText> 

    <Button 
     android:id="@+id/areaButton" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:onClick="findarea" 
     android:text="@string/findarea" 
     android:textSize="50sp" /> 

    <TextView 
     android:id="@+id/areaTextView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:layout_marginTop="30dp" 
     android:text="@string/area" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:textSize="40sp" /> 

    <EditText 
     android:id="@+id/answerEditText" 
     android:layout_width="83dp" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:ems="10" 
     android:hint="@string/areatextview" 
     android:inputType="numberDecimal" 
     android:text="@string/areaanswer" /> 

</LinearLayout> 
+0

Я бы выполнил код и удостоверился, что radiusEditText = (EditText) findViewById (R.id.radiusEditText); в конечном итоге не было null – SamFisher83

+3

(вне темы) 'double pi = 3.14;' вместо этого следует использовать 'Math.PI'. – Henry

+0

@ Хенри благодарю вас за эту информацию! –

ответ

2

Являются ли эти линии:

double pi = 3.14; 
double radius = Double.parseDouble(radiusEditText.getText().toString()); 
double finalRadius = radius * radius *pi; 
double area = Double.parseDouble(answerEditText.getText().toString()); 

действительно размещены вне любых методов? Если это так, они будут выполняться во время конструктора объекта - то есть до запускаonCreate(). Это означает, что radiusEditText еще не назначен и объяснит исключение нулевого указателя.

Чтобы решить, поместите их внутри findarea() (что предположительно вызвано некоторым методом обратного вызова) или в какой-либо другой метод обратного вызова, поэтому они запускаются после onCreate(). Например:

// Calculate PI beforehand 
final double pi = Math.PI; 

public void findarea(){ 
    // Calculate the value of answerEditText 
    double radius = Double.parseDouble(radiusEditText.getText().toString()); 
    double finalRadius = radius * radius *pi; 
    answerEditText.setText(String.valueOf(finalRadius)); 

    double area = Double.parseDouble(answerEditText.getText().toString()); 
    // do something with area? 
} 
+0

Ответ Алекс выглядит аккуратно. Я также замечаю, что вы делаете внутри findarea(), хотя технически верно, логически мало смысла. tip: используйте подходящие имена методов для их соответствующих действий. – tony9099

+0

Хороший улов alex :) –

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