Сбой программы Android, но в Android Studio нет явной ошибки
Я вставил часть своего кода ниже. Я пытаюсь получить эту кнопку, чтобы активировать приведенный ниже расчет и поместить результат в представление EditText. Я не вижу ошибок, перечисленных в программе, но она падает на моем телефоне Android, когда я нажимаю кнопку (кнопка калькуляции).
Мне интересно, есть ли проблема с моими расчетами BigDecimal, но я не знаю, почему не сообщается об ошибке.
public String massVal;
public String volVal;
public String volunitdes;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sfp);
//declare ListView
final ListView mass;
//get ListView object from xml
mass = (ListView) findViewById(R.id.mass);
//defined array values to show in ListView
String[] masslv = new String[]{"g", "mg", "µg", "mol", "mmol", "µmol"};
//define new Adapter
ArrayAdapter<String> massAdapter = new ArrayAdapter<String>
(this, android.R.layout.simple_list_item_1, android.R.id.text1, masslv);
//assign Adapter to ListView
mass.setAdapter(massAdapter);
//ListView Item Click Listener
mass.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//ListView Clicked item index
int itemPosition = position;
//ListView Clicked item value
String massVal = (String) mass.getItemAtPosition(position);
//declare EditText for mass and place clicked value (String massVal) into box
EditText masstext;
masstext = (EditText) findViewById(R.id.masstext);
masstext.setText(massVal);
}});
//button for final calculation
Button calcbutton;
calcbutton = (Button) findViewById(R.id.calcbutton);
calcbutton.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
//declare all manual number entries as EditText, then String, then BigDecimal
EditText CONCdes = (EditText) findViewById(R.id.CONCdes);
EditText voldes = (EditText) findViewById(R.id.voldes);
EditText MWbox = (EditText) findViewById(R.id.MWbox);
String CONCVAL = CONCdes.getText().toString();
String VOLDES = voldes.getText().toString();
String MW = MWbox.getText().toString();
BigDecimal CONCVALbd = new BigDecimal(CONCVAL).setScale(2, RoundingMode.HALF_UP);
BigDecimal VOLDESbd = new BigDecimal(VOLDES).setScale(2, RoundingMode.HALF_UP);
BigDecimal MWbd = new BigDecimal(MW).setScale(2, RoundingMode.HALF_UP);
//default calculation assumes ug/ml, ml vol units to measure, and mg units to weigh
BigDecimal FINPOWDMEAS;
FINPOWDMEAS = VOLDESbd.multiply(CONCVALbd).divide(BigDecimal.valueOf(1000)).setScale(2, RoundingMode.HALF_UP);
if (massVal.equals("g"))
{FINPOWDMEAS = FINPOWDMEAS.multiply(BigDecimal.valueOf(1000000)).setScale(2, RoundingMode.HALF_UP);}
if (massVal.equals("mg"))
{FINPOWDMEAS = FINPOWDMEAS.multiply(BigDecimal.valueOf(1000));}
if (massVal.equals("mol"))
{FINPOWDMEAS = VOLDESbd.multiply(CONCVALbd).multiply(MWbd).multiply(BigDecimal.valueOf(1000)).setScale(2, RoundingMode.HALF_UP);}
if (massVal.equals("mmol"))
{FINPOWDMEAS = (VOLDESbd.multiply(CONCVALbd).divide(BigDecimal.valueOf(1000))).multiply(MWbd).multiply(BigDecimal.valueOf(1000)).setScale(2, RoundingMode.HALF_UP);
if (massVal.equals("µmol"))
{FINPOWDMEAS = (VOLDESbd.multiply(CONCVALbd).divide(BigDecimal.valueOf(1000000))).multiply(MWbd).multiply(BigDecimal.valueOf(1000)).setScale(2, RoundingMode.HALF_UP);}
if (volVal.equals("L"))
{FINPOWDMEAS = FINPOWDMEAS.divide(BigDecimal.valueOf(1000)).setScale(2, RoundingMode.HALF_UP);}
if (volVal.equals("dL"))
{FINPOWDMEAS = FINPOWDMEAS.divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP);}
if (volVal.equals("µL")){FINPOWDMEAS = FINPOWDMEAS.multiply(BigDecimal.valueOf(1000)).setScale(2, RoundingMode.HALF_UP);}
//final calculation value to string
EditText FINPOWDMEASURE = (EditText) findViewById(R.id.FINPOWDMEASURE);
String FINALPOWDERMEASURE = FINPOWDMEAS.toString();
FINPOWDMEASURE.setText(FINALPOWDERMEASURE);}});
Исключение:
Process: vanwert.sdb, PID: 907
java.lang.NullPointerException
at vanwert.sdb.SFP$4.onClick(SFP.java:134)
at android.view.View.performClick(View.java:4438)
at android.view.View$PerformClick.run(View.java:18422)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
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:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
2 ответа
Линия
String massVal = (String) mass.getItemAtPosition(position);
заставляет вас присвоить значение новой переменной с именем massVal
с областью, отличной от ранее заявленной massVal
,
Переключите это на:
massVal = (String) mass.getItemAtPosition(position);
Есть несколько проблем.
Объявление члена класса massVal
как вы сделали здесь хорошо.
public String massVal;
Вы тогда повторно объявляете и назначаете massVal в анонимном OnItemClickListener
,
String massVal = (String) mass.getItemAtPosition(position);
В анонимном OnClickListener
это дает вам эту проблему, которая находится в совершенно иной области, чем анонимный OnItemClickListener
выше него, massVal никогда не назначается и поэтому все еще null
,
Обычно лучший дизайн выглядит примерно так:
public class SomeActivity extends Activity {
private Button myButton;
private EditText myEditText;
private String myString;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main.xml);
myEditText = (EditText) findViewById(R.id.my_edit_text);
myButton = (Button) findViewById(R.id.my_button);
myButton.setOnClickListener(new View.OnClickListener() {
String text = myEditText.getText()
if (text != null) {
myString = text.toString();
// ... continue processing your string
}
});
}
}