Java Android程序崩溃,但Android Studio中没有明显错误
我已经在下面粘贴了一些代码。我正在尝试使用此按钮激活下面的计算,并将结果放置在EditText视图中。我没有发现程序中列出的错误,但当我按下按钮(calcbutton)时,它会在我的Android手机上崩溃 我想知道我的BigDecimal计算是否有问题,但我不知道为什么没有报告错误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
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
}
});
}
}