我真的开始学习Java了。 当我运行此代码时,一切正常,直到我将EditText框保留为空并点击运行按钮。然后我得到:
ERROR/AndroidRuntime(866): FATAL EXCEPTION: main
ERROR/AndroidRuntime(866): java.lang.NumberFormatException:
ERROR/AndroidRuntime(866): at org.apache.harmony.luni.util.FloatingPointParser.parseDouble(FloatingPointParser.java:267)
我想当我尝试从字符串解析Double时,它没有获得任何值并产生错误。 我想知道如何避免这个错误,并给变量赋予某种值,所以它永远不会是空的?谢谢你的帮助!
import android.app.Activity;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Button;
import android.view.View;
import android.view.View.OnClickListener;
public class Main extends Activity {
private EditText noKids;
private EditText noGumballs;
private TextView noSum;
private Button b;
private Button br;
double etKids = 0;
double etGumballs = 0;
private double tvSumIn = 0.00;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initControls();
}
private void initControls() {
noKids = (EditText) findViewById(R.id.xetKids);
noGumballs = (EditText) findViewById(R.id.xetGumballs);
noSum = (TextView) findViewById(R.id.tvSum);
br = (Button) findViewById(R.id.xbtnReset);
br.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
reset();
br.setVisibility(View.INVISIBLE);
}
private void reset() {
noKids.setText("");
noGumballs.setText("");
noSum.setText("");
}
});
b = (Button) findViewById(R.id.xbtnCalculate);
b.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
calculate();
br.setVisibility(View.VISIBLE);
}
private void calculate() {
etKids = Double.parseDouble(noKids.getText().toString());
etGumballs = Double.parseDouble(noGumballs.getText().toString());
tvSumIn = etGumballs / etKids;
String thisIsIt = new Double(tvSumIn).toString();
if(tvSumIn < 2){
noSum.setText(thisIsIt + " This is it ");
}else{
noSum.setText("This is else");
}
}
});
}
}
这是我的main.xml文件 而且我猜测没有什么特别可以表现出来。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="How many kids have you got?"></TextView>
<EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="number" android:id="@+id/xetKids">
<requestFocus></requestFocus>
</EditText>
<TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="How many gumballs have you got?"></TextView>
<EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="number" android:id="@+id/xetGumballs"></EditText>
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Calculate" android:id="@+id/xbtnCalculate"></Button>
<TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/tvSum"></TextView>
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/xbtnReset" android:text="Reset" android:onClick="selfDestruct" android:visibility="invisible"></Button>
</LinearLayout>
答案 0 :(得分:17)
这是java.lang.Double类的JavaDoc,parseDouble方法:
/**
* Parses the specified string as a double value.
*
* @param string
* the string representation of a double value.
* @return the primitive double value represented by {@code string}.
* @throws NumberFormatException
* if {@code string} is {@code null}, has a length of zero or
* can not be parsed as a double value.
* @since Android 1.0
*/
空值不被视为可解析。这就是你得到这个例外的原因。
您可以对代码进行额外检查,以查看noKids EditText中的字符串是否为空,如果是,则手动将值设置为0.0:
noKidsStr = noKids.getText().toString();
if(noKidsStr == null || noKidsStr.isEmpty()) {
etKids = 0.0;
} else {
etKids = Double.parseDouble(noKids.getText().toString());
}
我建议你写一些方便实用的方法,你可以在将来为所有类似的情况重复使用。
答案 1 :(得分:4)
你应该在try / catch子句中包装Double.parseDouble ..语句,以捕获任何NumberFormatExceptions,并设置其失败的其他值
编辑:
try{
etKids = Double.parseDouble(noKids.getText().toString());
} catch (final NumberFormatException e) {
etKids = 1.0;
}
try{
etGumballs = Double.parseDouble(noGumballs.getText().toString());
} catch (final NumberFormatException e) {
etGumballs = 1.0;
}
答案 2 :(得分:2)
你可以做两件事: 首先,只允许EditText字段中的数字数据。实际上,我看到你已经这样做了。 我通常使用android:numeric - 这是我见过的第一个android:inputType。感谢那。 =)
其次,通过简单的检查确保EditText中有文本。
if(noKids.getText().length() > 0)
{
etKids = Double.parseDouble(noKids.getText().toString());
}
答案 3 :(得分:0)
这是一个java问题,而不是android问题。
您应该在代码中处理NumberFormat异常。如果有人在文本框中输入“abc”会怎么样?您希望自己的应用做什么?您可以使用try / catch块处理异常:http://tutorials.jenkov.com/java-exception-handling/basic-try-catch-finally.html
您可能还想在尝试转换之前检查noKids.getText()。toString()是否为空。如果字符串是“”vs,如果字符串是“abc”,那么对用户有不同的反馈可能是有意义的。
答案 4 :(得分:0)
private void calculate() {
try{
etKids = Double.parseDouble(noKids.getText().toString());
etGumballs = Double.parseDouble(noGumballs.getText().toString());
tvSumIn = etGumballs / etKids;
}catch(exception e)
{
e.printStackTrace():
}
String thisIsIt = new Double(tvSumIn).toString();
if(tvSumIn < 2){
noSum.setText(thisIsIt + " This is it ");
}else{
noSum.setText("This is else");
}
}
答案 5 :(得分:0)
另一项改进:
String thisIsIt = new Double(tvSumIn).toString();
if(tvSumIn < 2){
noSum.setText(thisIsIt + " This is it ");
}else{
noSum.setText("This is else");
}
可能是:
if(tvSumIn < 2){
noSum.setText(tvSumIn + " This is it ");
}else{
noSum.setText("This is else");
}
然后您不必创建无用的字符串
答案 6 :(得分:0)
我认为检查值是否正确的最佳方法如下:
noKidsStr = noKids.getText().toString();
try
{
etKids = Double.parseDouble(noKids.getText().toString());
}
catch (NumberFormatException e)
{
//Here request a valid value
Toast.makeText(getBaseContext(), "value is not valid", Toast.LENGTH_LONG).show();
noKids.requestFocus();
return;
//Or you can add a value
}
}
我认为这种方法更优雅,并考虑了他们添加的任何类型的输入。 BR, 阿德里安。
答案 7 :(得分:0)
试试这段代码 TextView_object.setText(new Double(sum).toString());
答案 8 :(得分:0)
延伸到弗拉德米尔的帖子(我不能对该特定的帖子添加评论)
您可以使用以下两行而不是if / else块(在某些情况下使用?等同于if / else)时可以做到这一点。
noKidsStr = noKids.getText().toString();
etKids = (noKidsStr == null || noKidsStr.isEmpty())?0.0:Double.parseDouble(noKids.getText().toString());