1

非常に簡単な解決策があるように思われる質問で、ここで誰かに助けてもらいたいと思いますが、アプリケーションはエミュレーターで何度もクラッシュし続けます。

エクササイズ -

3 つのアクティビティを含むアプリケーションを作成します
。 1. (メイン) 最初のアクティビティには 2 つのボタンが含まれており、それぞれをクリックすると他のアクティビティの 1 つを操作します。
2. 2 番目のアクティビティでは、顧客情報を入力できます: 顧客名、男性か女性か、年齢か、追加するボタンがあります - クリックすると顧客が ArrayList に追加されます。アクティビティを終了するときは、すべての顧客の ArrayList をファイルに追加しておく必要があります。3.ユーザーが既存の顧客の合計を確認できるようにする3 番目の
アクティビティ-> ファイルから読み取ったデータ。

Serializable を実装する「Customer」クラス、「Main」アクティビティ、および「ViewCustomers」アクティビティはすべて非常に簡単に記述できます。「AddCustomer」アクティビティにより、アプリケーションがクラッシュします。その (迷惑な) 2 番目のアクティビティの次のコードに基づいて、アプリケーションが繰り返しクラッシュする理由を教えてください。

 import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.*;
    import java.io.*;
    import java.util.ArrayList;

    public class AddCustomerActivity extends Activity {
    static final String CUSTOMERSFILE="customers";
    ArrayList<Customer> customers;
    EditText name, age;
    CheckBox male;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.addcustomerscreen);
        name=(EditText)findViewById(R.id.nameText);
        age=(EditText)findViewById(R.id.ageText);
        male=(CheckBox)findViewById(R.id.maleCheckBox);
        Button add=(Button)findViewById(R.id.addcustomerbutton);

        FileInputStream fis;
        ObjectInputStream ois=null;
        try {
            fis=openFileInput(CUSTOMERSFILE);
            ois=new ObjectInputStream(fis);
            customers=(ArrayList<Customer>)ois.readObject();
            if(customers==null)
                customers=new ArrayList<Customer>();
        }
        catch(ClassNotFoundException ex)
        {
            Log.e("add customers","serialization problem",ex);
        }
        catch(IOException ex)
        {
            Log.e("add customers","No customers file",ex);
            customers=new ArrayList<Customer>();
        }
        finally
        {
            try {
                ois.close();
            } catch (IOException e) {
                e.printStackTrace();
            }       
        }

        add.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                String theName=name.getText().toString();
                int theAge=Integer.parseInt(age.getText().toString());
                boolean isMale=male.isChecked();
                customers.add(new Customer(theName, theAge, isMale));
                name.setText("");
                age.setText("");
            }
        });

    }

    @Override
    protected void onPause() {
        super.onPause();
        FileOutputStream fos;
        ObjectOutputStream ous=null;
        try {
            fos=openFileOutput(CUSTOMERSFILE, Activity.MODE_PRIVATE);
            ous=new ObjectOutputStream(fos);
            ous.writeObject(customers);
        }

        catch(IOException ex)
        {
            Log.e("add customers","some problem",ex);
        }
        finally
        {
            try {
                ous.close();
            } catch (IOException e) {
                e.printStackTrace();
            }       
        }
    }



    }   

PS「OnPause」のコードは、内部ストレージにファイルを作成し、少なくとも 2 回目の実行でコードを機能させるはずでしたが、そうではありません。


  • UPDATE (LogCat の要求による)

これらはログです。
ボタンを押すと最初の赤い\エラー行が表示されますが、(明示的な意図により)
「ManuActivity」から「AddCustomerActivity」につながると思われ
ますが、その後アプリケーションがクラッシュしました。

「AddCustomerActivity」の冒頭に示されているエラー ログへのリンク:

(パートA)
http://tinypic.com/r/14brzgn/5

(パート B)
http://tinypic.com/r/12546qa/5

4

1 に答える 1

0

あなたのクラッシュはラインによって引き起こされます

ois.close();

このシナリオ (まだ読み取るファイルがない場合) では、初期化されていないためです。oisつまり、null. これを単純な if でラップして解決することをお勧めします。

try {
    if(ois != null) {
        ois.close();
    }
} catch(IOException e) {
...
于 2014-01-26T11:37:28.443 に答える