1

我正在尝试创建一个for-loop 来将视图添加到布局中。-loop 工作正常(我尝试使用for初始化变量),但我需要从EditText. 我使用了 atry-catch并且 LogCat 告诉我以下内容...

java.lang.NumberFormatException: invalid int "".

网站developers.android.com 说这是由于错误地将字符串转换为整数,但我不明白我是如何错误地从EditText.

这是我的代码...

public class UserPref2Activity extends Activity 

{
@Override

public void onCreate(Bundle savedInstanceState) 
{
    try
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        EditText numSensors = (EditText) findViewById(R.id.num_sensors);
        String change = numSensors.getText().toString();
        int i = Integer.parseInt(change);

        int j; //iterates through the for loop 

        ScrollView sv = new ScrollView(this);
        LinearLayout ll = new LinearLayout(this);
        ll.setOrientation(LinearLayout.VERTICAL);
        sv.addView(ll);

        for(j=1;j<i;j++)
        {
            EditText name = new EditText(this);
            name.setText("Name:");
            EditText type = new EditText(this);
            type.setText("Type:");
            EditText bits = new EditText(this);
            bits.setText("Bits:");
            ll.addView(name);
            ll.addView(type);
            ll.addView(bits);
        } 
        this.setContentView(sv);
    }
    catch (Exception e)
    {
        //sends actual error message to the log
        Log.e("ERROR", "ERROR IN CODE:" + e.toString());
        //prints out location of error
        e.printStackTrace();
    }
  }
}

这是我的 XML 文件...

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

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Enter number of sensors:" />

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:inputType="number"
    android:id="@+id/num_sensors" /> 

4

7 回答 7

5

EditText最初的值是空String的(即"")。这显然不是一个数字,因此当您尝试调用int i = Integer.parseInt(change);它时,会出现这样的错误。

有几种方法可以解决这个问题,但基本上可以归结为通过设置初始值来防止错误,或者检测空字符串并正确处理它。

为了防止错误发生...

EditText numSensors = (EditText) findViewById(R.id.num_sensors);
String change = numSensors.getText().toString();
if (change.equals("")){ // detect an empty string and set it to "0" instead
    change = "0";
}
int i = Integer.parseInt(change);

或者将初始值设置"0"EditText,但是这也会0EditText界面上显示值而不是空的,因此它可能不适合所有用途...

<EditText android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:inputType="number"
          android:text="0"
          android:id="@+id/num_sensors" />

如果你想检测错误并正确处理它,你会这样做......

EditText numSensors = (EditText) findViewById(R.id.num_sensors);
String change = numSensors.getText().toString();
int i = 0; // set it to 0 as the default
try {
    i = Integer.parseInt(change);
}
catch (NumberFormatException e){}

这基本上设置了 的值,并且只有在代码没有给出错误i = 0时才会将其更改为不同的值。try{}

于 2012-06-20T13:51:25.307 回答
1

如果您尝试解析空字符串,它将始终抛出NumberFormatException.

将您的代码更改为以下。

int i;
String change = numSensors.getText().toString();
if(change.length>0)
{
  i = Integer.parseInt(change);
}
else
{
   i=0;
}  
于 2012-06-20T05:23:27.460 回答
0

我认为初始编辑文本将为空,因此“”(blank is not a valid input)是错误的,您应该在编辑文本中填写数据,然后单击任何事件,您应该进行解析工作....

于 2012-06-20T05:23:09.223 回答
0

编辑布局文件

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:inputType="number"
android:text="0"
    android:id="@+id/num_sensors" /> 
于 2012-06-20T05:24:42.553 回答
0

您收到此错误是因为""您的编辑文本中最初没有任何内容或 /Empty String。获取仍在显示的编辑文本的文本是没有意义的。您可能想要一个按钮或其他一些事件来表示用户已完成在编辑文本中输入值,然后您可以继续获取编辑文本的值。但总是检查空字符串

于 2012-06-20T05:27:16.833 回答
0

因为您在 parseInt() 中传递了空字符串,所以在将字符串解析为 int 之前进行检查:

EditText numSensors  = (EditText) findViewById(R.id.num_sensors);
String change  = numSensors.getText().toString();
if (change.trim().equals("")) {
 //DO SOMETHING HERE
}
else
{
int i = Integer.parseInt(change);
YOUR CODE HERE....
}
于 2012-06-20T05:29:22.317 回答
0

为了防止 int 获得“”值,这是在空的 EditText 字段中第二次单击时发生的情况,您可以在 java 代码中抛出这一行:

int i;
String change = numSensors.getText().toString();
if(!(change.equals("")))
{
  i = Integer.parseInt(change);
}
于 2015-11-15T23:25:15.777 回答