Android:当有一个空白的editText字段时,我的应用程序崩溃了

Posted

技术标签:

【中文标题】Android:当有一个空白的editText字段时,我的应用程序崩溃了【英文标题】:Android : My app crashes when there is a blank editText field 【发布时间】:2012-02-21 21:59:14 【问题描述】:

我的代码有问题。 当我有一个空白的 editText 字段时,它一直在崩溃。 这段代码在我的应用程序的设置中,可以正常工作,但是当有一个空白字段时,它会使程序崩溃。 这是它的代码。 请不要苛刻,因为这是我的第一个 android 应用程序。因此,如果有人知道如何解决空白编辑文本字段问题,将不胜感激! (任何其他关于如何改进应用程序的 cmets 都会有所帮助)。

干杯

package com.cleanyet.cyv100fp;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class sTasks extends Activity 


@Override
protected void onCreate(Bundle savedInstanceState) 
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.tasks);     

    /*Sets Up the Variables*/
    Button done = (Button) findViewById(R.id.done1);
    EditText t1 = (EditText)findViewById(R.id.tbTask1);
    EditText t2 = (EditText)findViewById(R.id.tbTask2);
    EditText t3 = (EditText)findViewById(R.id.tbTask3);
    EditText t4 = (EditText)findViewById(R.id.tbTask4);
    EditText t5 = (EditText)findViewById(R.id.tbTask5);

    String FILENAME1 = "stask1";
    String FILENAME2 = "stask2";
    String FILENAME3 = "stask3";
    String FILENAME4 = "stask4";
    String FILENAME5 = "stask5";

    String task1 = null;
    String task2 = null;
    String task3 = null;
    String task4 = null;
    String task5 = null;

    String edit = "Edit Task";

    /*Fixes the Blank Field bug*/

    /*Sets up the file input*/
    FileInputStream fis = null;

    /*Gets the tasks set previously*/

    /*Task 1 set up*/
    try 
        fis = openFileInput(FILENAME1);
        byte[] dataArray = new byte[fis.available()];
        while (fis.read(dataArray) != -1)
            task1 = new String(dataArray);

        

     catch (FileNotFoundException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
     catch (IOException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
    
    finally 
        try 
            fis.close();
         catch (IOException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
        
    
    if (task1.toString().length() < 0) 

    task1.toString();

    t1.setText(task1);
    
    else 
        t1.setText(edit);
    
    /*Task 2 set up*/

    try 
        fis = openFileInput(FILENAME2);
        byte[] dataArray = new byte[fis.available()];
        while (fis.read(dataArray) != -1)
            task2 = new String(dataArray);

        

     catch (FileNotFoundException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
     catch (IOException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
    
    finally 
        try 
            fis.close();
         catch (IOException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
        
    
    if (task2.toString().length() < 0) 

    task2.toString();

    t2.setText(task2);
    
    else 
        t2.setText(edit);
    
    /*Task 3 set up*/

    try 
        fis = openFileInput(FILENAME3);
        byte[] dataArray = new byte[fis.available()];
        while (fis.read(dataArray) != -1)
            task3 = new String(dataArray);

        

     catch (FileNotFoundException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
     catch (IOException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
    
    finally 
        try 
            fis.close();
         catch (IOException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
        
    

    if (task3.toString().length() < 0) 

    task3.toString();

    t3.setText(task3);
    
    else 
        t3.setText(edit);
    
    /*Task 4 set up*/


    try 
        fis = openFileInput(FILENAME4);
        byte[] dataArray = new byte[fis.available()];
        while (fis.read(dataArray) != -1)
            task4 = new String(dataArray);

        

     catch (FileNotFoundException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
     catch (IOException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
    
    finally 
        try 
            fis.close();
         catch (IOException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
        
    

    if (task4.toString().length() < 0) 

    task4.toString();

    t4.setText(task4);
    
    else 
        t4.setText(edit);
    
    /*Task 5 set up*/           

    try 
        fis = openFileInput(FILENAME5);
        byte[] dataArray = new byte[fis.available()];
        while (fis.read(dataArray) != -1)
            task5 = new String(dataArray);

        

     catch (FileNotFoundException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
     catch (IOException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
    
    finally 
        try 
            fis.close();
         catch (IOException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
        
    

    if (task5.toString().length() < 0) 

    task5.toString();

    t5.setText(task5);
    
    else 
        t5.setText(edit);
    

    /*When changes have been made and done is clicked*/
    done.setOnClickListener(new View.OnClickListener() 

        public void onClick(View v) 
            // TODO Auto-generated method stub

            /*Sets up the Variables*/
            EditText t1 = (EditText)findViewById(R.id.tbTask1);
            EditText t2 = (EditText)findViewById(R.id.tbTask2);
            EditText t3 = (EditText)findViewById(R.id.tbTask3);
            EditText t4 = (EditText)findViewById(R.id.tbTask4);
            EditText t5 = (EditText)findViewById(R.id.tbTask5);

            String tasks1 = t1.getText().toString();
            String tasks2 = t2.getText().toString();
            String tasks3 = t3.getText().toString();
            String tasks4 = t4.getText().toString();
            String tasks5 = t5.getText().toString();

            String FILENAME1 = "stask1";
            String FILENAME2 = "stask2";
            String FILENAME3 = "stask3";
            String FILENAME4 = "stask4";
            String FILENAME5 = "stask5";

            String task1 = tasks1;
            String task2 = tasks2;
            String task3 = tasks3;
            String task4 = tasks4;
            String task5 = tasks5;
            String edit = "Go to settings to make this task.";

            if (t1 != null)

                t1.setText(edit);
                /*t2.setText(edit);
                t3.setText(edit);
                t4.setText(edit);
                t5.setText(edit);*/

            ;

            /*Put if statement here to catch the empty field*/

            /*Makes The Changes to the Tasks*/
            try 

                FileOutputStream fos1 = openFileOutput(FILENAME1, Context.MODE_PRIVATE);
                fos1.write(task1.getBytes());
                fos1.close();

             catch (FileNotFoundException e) 
                // TODO Auto-generated catch block
                e.printStackTrace();
             catch (IOException e) 
                // TODO Auto-generated catch block
                e.printStackTrace();
            

            try 

                FileOutputStream fos2 = openFileOutput(FILENAME2, Context.MODE_PRIVATE);
                fos2.write(task2.getBytes());
                fos2.close();

             catch (FileNotFoundException e) 
                // TODO Auto-generated catch block
                e.printStackTrace();
             catch (IOException e) 
                // TODO Auto-generated catch block
                e.printStackTrace();
            

            try 

                FileOutputStream fos3 = openFileOutput(FILENAME3, Context.MODE_PRIVATE);
                fos3.write(task3.getBytes());
                fos3.close();

             catch (FileNotFoundException e) 
                // TODO Auto-generated catch block
                e.printStackTrace();
             catch (IOException e) 
                // TODO Auto-generated catch block
                e.printStackTrace();
            

            try 

                FileOutputStream fos4 = openFileOutput(FILENAME4, Context.MODE_PRIVATE);
                fos4.write(task4.getBytes());
                fos4.close();

             catch (FileNotFoundException e) 
                // TODO Auto-generated catch block
                e.printStackTrace();
             catch (IOException e) 
                // TODO Auto-generated catch block
                e.printStackTrace();
            

            try 

                FileOutputStream fos5 = openFileOutput(FILENAME5, Context.MODE_PRIVATE);
                fos5.write(task5.getBytes());
                fos5.close();

             catch (FileNotFoundException e) 
                // TODO Auto-generated catch block
                e.printStackTrace();
             catch (IOException e) 
                // TODO Auto-generated catch block
                e.printStackTrace();
            


            startActivity(new Intent("com.checkin.cyv100fp.settings"));

        
    );






【问题讨论】:

堆栈跟踪会很有帮助... 所以...这是一大块代码。什么是异常,它在哪里被抛出? 对您的应用的建议:在您可以随时重复操作时使用循环。它使您的代码更具可读性,更容易修改,以及这样的 我会按照这里其他人的建议作为初学者。如果设置断点并逐行遍历文件以查看导致异常的确切行,您也可以做另一件事。 【参考方案1】:
if (task1.toString().length() < 0) 
    task1.toString();
    t1.setText(task1);

else 
    t1.setText(edit);

以上说的毫无意义。

首先task1 是一个字符串,因此无需调用toString() 将其转换为一个。

其次,您的条件语句 (if) 正在检查 task1 的长度是否小于零……考虑一下。

第三,如果它确实有一个不可能的长度小于零,那么你再次调用toString()(没有变量来接收不可能小于零的结果)然后你尝试设置你的文本t1 EditText.

您的文件读取可能失败(可能是因为您稍后仅在 onClick(...) 方法中保存字符串)。因为如果文件读取失败,您的task 字符串将为null,那么您需要在尝试使用它们之前测试null

换句话说,您正在代码中执行此操作...

String task1 = null;

要修复我在开头附上的那段代码,请使用...

if (task1 != null) 
    t1.setText(task1);

else 
    t1.setText(edit);

...但最重要的是,确保您的文件中包含您需要读取的字符串。

【讨论】:

感谢 MisterSqunok!我知道我以前哪里出错了。它没有解决问题,但确实解决了其他问题之一哈哈再次感谢:)

以上是关于Android:当有一个空白的editText字段时,我的应用程序崩溃了的主要内容,如果未能解决你的问题,请参考以下文章

无法从edittext获取值到字符串

EditText常用属性:空白提示/文本域/特殊字符/数字类型/等属性设置

Android - 不自动选择 EditText 字段[重复]

Android:如何更改 EditText 字段中的文本大小?

如何在 Android 中禁用 EditText

带有 inputType numberDecimal 的 Android EditText 字段设置默认值