Java Android程序崩溃,但Android Studio中没有明显错误

Java Android程序崩溃,但Android Studio中没有明显错误,java,android,bigdecimal,Java,Android,Bigdecimal,我已经在下面粘贴了一些代码。我正在尝试使用此按钮激活下面的计算,并将结果放置在EditText视图中。我没有发现程序中列出的错误,但当我按下按钮(calcbutton)时,它会在我的Android手机上崩溃 我想知道我的BigDecimal计算是否有问题,但我不知道为什么没有报告错误 public String massVal; public String volVal; public String volunitdes; @Override protected void onCreate(B

我已经在下面粘贴了一些代码。我正在尝试使用此按钮激活下面的计算,并将结果放置在EditText视图中。我没有发现程序中列出的错误,但当我按下按钮(calcbutton)时,它会在我的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);}});
线路

String massVal = (String) mass.getItemAtPosition(position);  
正在使您将值分配给名为
massVal
的新变量,该变量的作用域与先前声明的
massVal
不同
切换到:

massVal = (String) mass.getItemAtPosition(position);

有一些问题

像您在这里所做的那样声明类成员
massVal

public String massVal;
然后,您将在一个匿名
OnItemClickListener
中重新声明和分配massVal

String massVal = (String) mass.getItemAtPosition(position);
在给您带来此问题的匿名
OnClickListener
中,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
            }
        });
    }
}

如果你的应用程序崩溃,日志中肯定会有一些信息。如果没有它,很难说确切的问题是什么,但是我可以看到一些情况,其中可能有
NullPointerException
。我从LogCat中添加了一些信息,但是有很多信息。在我启动程序之前,以及在我断开手机连接之后(崩溃之后),似乎都在播放流媒体。我试图在日志中找出错误。我是编程新手。空指针异常不应该只在程序试图检索的数据丢失时发生吗?在按下按钮之前,我已经在所有适当的编辑文本框中输入了数字,所以我很困惑。哪一行代码是
SFP.java:134
?又称作
SFP.java
中的第134行
134
是什么代码?第一个“if”语句在哪里分配
massVal
<代码>空点例外在那一行意味着
massVal.equals(“g”)
被解析为
null.equals(“g”)
,这是你们不能做的。你们是天才@Vitor和Justin我希望我能投票给你们,但我的声誉还不够@Justin。非常感谢你。它正在工作!!我知道我需要更多的了解它,但是什么时候我会使用一个非匿名的onclick监听器呢?哦,没问题,很乐意帮忙。至于匿名与非匿名,这真的取决于你。如果我有一个非常简单的
onClick
方法,我会使用一个匿名类,但是如果我在做一些更复杂的事情,我会将所有逻辑移到它自己的命名类中。它会大量清理代码(例如,
myButton.setOnClickListener(新的MyCustomOnClickListener());
),但如果您想使用该类执行UI操作,则可能会很烦人(因为这样您就必须传递对组件的引用)。因此,如果在EditText视图中没有输入任何内容,EditText将永远不会转换为字符串(这可能会导致空指针异常)?是的。您可能会在“网络”上找到如下代码:
myEditText.getText().toString()
,但如果在
EditText
中未输入任何内容,则
myEditText.getText()
将返回null,留给您的是
null.toString()
。为了安全起见,我通常会将操作分开并检查
null
。这只是我的第二个程序,第一个是在Google Play市场上。在此之前,我从来没有编写过任何程序。这很乏味,但也很有意义。这就像用勺子努力突破混凝土,在其他地方找到天堂一样呃,这需要很大的耐心。
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
            }
        });
    }
}