0

我正在编写一个 android 应用程序,但出现 onTextChanged 错误,我的应用程序是货币转换器,当我想在文本上输入金额时,应用程序崩溃。

这是我的代码:

public class Currency_convert extends Activity
{
    /** Called when the activity is first created. */

    float inputValue;
    Handler h;
    static int decimalsize = 2;
    public DecimalFormat df = new DecimalFormat();

    String US = "USD";//us dollar
    String EURO = "EUR";
    String INR = "INR";//Indian rupee
    String AUD = "AUD";//australian dollar
    String GBP = "GBP";//Pound sterling
    String ILS = "ILS";
    String TRY = "TRY";
    String RUB = "RUB";
    String JPY = "JPY";
    String MYR = "MYR";

    public Double dUS;// = 0.0;
    public Double dEURO;// = 1.0;
    public Double dINR;// = 0.0;
    public Double dAUD;// = 0.0;
    public Double dGBP;// = 0.0;
    public Double dILS;// = 0.0;
    public Double dTRY;
    public Double dRUB;
    public Double dJPY;
    public Double dMYR;
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.currency);
     //  setHeader(getString(R.string.currency), true);
        boolean rateupdate = false;

       AbsoluteLayout al = (AbsoluteLayout) findViewById(R.id.AbsoluteLayout01);
        al.setBackgroundColor(Color.LTGRAY);//


        final EditText amount = (EditText) findViewById(R.id.txt1);
        final EditText etResult = (EditText) findViewById(R.id.txt2);

        final Spinner sp1=(Spinner) findViewById(R.id.spinerr1);
        final Spinner sp2=(Spinner) findViewById(R.id.spinerr2);

        final InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
        ArrayAdapter adapter = ArrayAdapter.createFromResource(this, R.array.currency, android.R.layout.simple_spinner_item);
        final Button btn = (Button) findViewById(R.id.bb1);

        amount.setText("0.0");
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        sp1.setAdapter(adapter);
        sp2.setAdapter(adapter);

        rateupdate = getRate();
        if(rateupdate)
            btn.setText("Currency Rate updated");
        else
            btn.setText("Updated Currency Rate ");

        //btn.setText(Boolean.toString(rateupdate));

        OnClickListener ltouch = new OnClickListener() 
        {
            public void onClick(View v) 
            {
                // TODO Auto-generated method stub
                //getRate();
            }
        };;;
        btn.setOnClickListener(ltouch );

        OnItemClickListener itemClick = new OnItemClickListener() 
        {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position,long id) 
            {

                int curr1 = (int) sp1.getSelectedItemId();
                int curr2 = (int) sp2.getSelectedItemId();
                double result = Convert(curr1, curr2, amount.getText().toString());

                etResult.setText(Double.toString(result));

            }
        };

        OnItemSelectedListener ItemSelectListener = new OnItemSelectedListener()
        {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view,int position, long id) 
            {
                try
                {

                    int curr1 = (int) sp1.getSelectedItemId();
                    int curr2 = (int) sp2.getSelectedItemId();
                    double result = Convert(curr1, curr2, amount.getText().toString());
                    etResult.setText(Double.toString(result));

                }
                catch(Exception e)
                {

                }

            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0) 
            {
                // TODO Auto-generated method stub

            }
        };
        sp1.setOnItemSelectedListener(ItemSelectListener);
        sp2.setOnItemSelectedListener(ItemSelectListener);

        amount.addTextChangedListener(new TextWatcher() 
        {
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) 
            {
                int length = s.length();
                if(length == 0)
                    //amount.setText("0.0");
                    s = "0.0";
                int curr1 = (int) sp1.getSelectedItemId();
                int curr2 = (int) sp2.getSelectedItemId();
                //double result = Convert(curr1, curr2, amount.getText().toString());
                double result = Convert(curr1, curr2, s.toString());

                etResult.setText(Double.toString(result));      
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,int after) 
            {
            }
            @Override
            public void afterTextChanged(Editable s) 
            {
                // TODO Auto-generated method stub
            }
        });
        OnTouchListener l = new OnTouchListener() 
        {
            @Override
            public boolean onTouch(View v, MotionEvent event) 
            {
                // TODO Auto-generated method stub
                imm.hideSoftInputFromWindow(amount.getWindowToken(),0);//
                return true;
            }
        }; 
        al.setOnTouchListener(l);
        sp1.setSelection(4);
        sp2.setSelection(0);
    }

    protected Double Convert(int currency_from_index, int currency_to_index, String s_amount) 
    {
        // TODO Auto-generated method stub
        Double result = 0.0;
        Double amount = Double.parseDouble(s_amount);
        Double source = 0.0;
        Double destination = 0.0;

        if((dUS * dAUD * dINR * dGBP * dEURO * dTRY * dRUB * dJPY * dMYR) == 0)
        {
            result = 0.0;
            return result;
        }
        else
        {

            switch (currency_from_index) 
            {
            case 0:
                source = dUS;
                break;
            case 1:
                source = dAUD;
                break;
            case 2:
                source = dINR;
                break;
            case 3:
                source = dGBP;
                break;
            case 4:
                source = dEURO;
                break;
            case 5:
                source = dILS;
                break;
            case 6:
                source = dTRY;
                break;
            case 7:
                source = dRUB;
                break;
            case 8:
                source = dJPY;
                        break;
            case 9:
                source = dMYR;
                        break;
            default:
                break;
            }

            switch (currency_to_index)
            {
            case 0:
                destination = dUS;
                break;
            case 1:
                destination = dAUD;
                break;
            case 2:
                destination = dINR;
                break;
            case 3:
                destination = dGBP;
                break;
            case 4:
                destination = dEURO;
                break;
            case 5:
                destination =dILS;
                break;
            case 6:
                destination =dTRY;
                break;
            case 7:
                destination =dRUB;
                break;
            case 8:
                destination =dJPY;
                break;

            case 9:
                destination =dMYR;
                break;
            default:
                break;
            }

            result = amount*destination/source;
            Math.round(result);
            try
            {
            df.setMaximumFractionDigits(decimalsize);   
            df.setMinimumFractionDigits(decimalsize);
            String str_result = df.format(result);
            result = Double.parseDouble(str_result);
            }
            catch(Exception e)          
            {

            }

            return result;
        }

    }


    public boolean getRate()
    {
        //ConversionRate cr = new ConversionRate();
        try
        {

         //URL url = new URL(eText.getText().toString());
            String path = "http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml";
        URL url = new URL(path);
        URLConnection conn = url.openConnection();
        // Get the response
        BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));

        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        factory.setNamespaceAware(true);
        XmlPullParser xpp = factory.newPullParser();

        //xpp.setInput( new StringReader ( "<foo>Hello World!</foo>" ) );
        xpp.setInput(rd);
        int eventType = xpp.getEventType();
        while (eventType != XmlPullParser.END_DOCUMENT) 
        {
         if(eventType == XmlPullParser.START_DOCUMENT) 
         {
             //System.out.println("Start document");
             //tView.append("Start document");
         } 
         else if(eventType == XmlPullParser.END_DOCUMENT) 
         {
             //System.out.println("End document");
             //tView.append("End document");
         } 
         else if(eventType == XmlPullParser.START_TAG) 
         {
             //System.out.println("Start tag "+xpp.getName());
             //tView.append("Start tag "+xpp.getName());
             //tView.append("Attribute Count = " + xpp.getAttributeCount());
             if(xpp.getAttributeCount() > 1)
             {
                 /*tView.append("Currency = " + xpp.getAttributeValue(0) + "\t");
                 tView.append("Rate = " + xpp.getAttributeValue(1));
                 tView.append("\n");*/
                 //cr.setName(xpp.getAttributeValue(0));
                 //cr.setRate(Double.parseDouble(xpp.getAttributeValue(1)));
                 if(xpp.getAttributeValue(0).equals(US))// toString()== US)
                     Currency_convert.this.dUS = Double.parseDouble(xpp.getAttributeValue(1));
                 else if(xpp.getAttributeValue(0).equals(INR))// .toString() == "INR")
                     dINR = Double.parseDouble(xpp.getAttributeValue(1));
                 else if(xpp.getAttributeValue(0).equals(GBP))// .toString() == "GBP")
                     dGBP = Double.parseDouble(xpp.getAttributeValue(1));
                 else if(xpp.getAttributeValue(0).equals(AUD))// .toString() == "AUD")
                     dAUD = Double.parseDouble(xpp.getAttributeValue(1));

                 else if(xpp.getAttributeValue(0).equals(ILS))
                     dILS = Double.parseDouble(xpp.getAttributeValue(1));
                 else if(xpp.getAttributeValue(0).equals(TRY))
                     dTRY = Double.parseDouble(xpp.getAttributeValue(1));
                 else if(xpp.getAttributeValue(0).equals(RUB))
                     dRUB = Double.parseDouble(xpp.getAttributeValue(1));
                 else if(xpp.getAttributeValue(0).equals(JPY))
                     dJPY = Double.parseDouble(xpp.getAttributeValue(1));
                 else if(xpp.getAttributeValue(0).equals(MYR))
                     dMYR = Double.parseDouble(xpp.getAttributeValue(1));
             } 
         } 
         else if(eventType == XmlPullParser.END_TAG) 
         {
             //System.out.println("End tag "+xpp.getName());
             //tView.append("End tag "+xpp.getName());
         } 
         else if(eventType == XmlPullParser.TEXT) 
         {
             //System.out.println("Text "+xpp.getText());
             //tView.append("Text "+xpp.getText());
         }
         eventType = xpp.next();
        }
        return true;
        }
        catch(Exception e)
        {
            e.printStackTrace();
            return false;
        }

    }


}

这是我得到的logcat:

11-06 05:59:49.208: E/AndroidRuntime(5314): FATAL EXCEPTION: main
11-06 05:59:49.208: E/AndroidRuntime(5314): java.lang.NullPointerException
11-06 05:59:49.208: E/AndroidRuntime(5314):     at com.example.dashboard_our.Currency_convert.Convert(Currency_convert.java:209)
11-06 05:59:49.208: E/AndroidRuntime(5314):     at com.example.dashboard_our.Currency_convert$4.onTextChanged(Currency_convert.java:171)
11-06 05:59:49.208: E/AndroidRuntime(5314):     at android.widget.TextView.sendOnTextChanged(TextView.java:7318)
11-06 05:59:49.208: E/AndroidRuntime(5314):     at android.widget.TextView.handleTextChanged(TextView.java:7377)
11-06 05:59:49.208: E/AndroidRuntime(5314):     at android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:9076)
11-06 05:59:49.208: E/AndroidRuntime(5314):     at android.text.SpannableStringBuilder.sendTextChanged(SpannableStringBuilder.java:962)
11-06 05:59:49.208: E/AndroidRuntime(5314):     at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:496)
11-06 05:59:49.208: E/AndroidRuntime(5314):     at android.text.SpannableStringBuilder.delete(SpannableStringBuilder.java:212)
11-06 05:59:49.208: E/AndroidRuntime(5314):     at android.text.SpannableStringBuilder.delete(SpannableStringBuilder.java:30)
11-06 05:59:49.208: E/AndroidRuntime(5314):     at android.text.method.BaseKeyListener.backspaceOrForwardDelete(BaseKeyListener.java:94)
11-06 05:59:49.208: E/AndroidRuntime(5314):     at android.text.method.BaseKeyListener.backspace(BaseKeyListener.java:49)
11-06 05:59:49.208: E/AndroidRuntime(5314):     at android.text.method.BaseKeyListener.onKeyDown(BaseKeyListener.java:155)

这是xml文件:

<?xml version="1.0" encoding="utf-8"?>




<AbsoluteLayout android:id="@+id/AbsoluteLayout01" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
     xmlns:android="http://schemas.android.com/apk/res/android">

<EditText android:id="@+id/txt1"
     android:text="@+id/EditText01" 
     android:layout_height="wrap_content"
      android:layout_width="wrap_content"
       android:layout_y="10dip" 
       android:numeric="decimal" 
       android:singleLine="true"
android:ems="8"
 android:hint="Enter amount" 
 android:layout_x="5dip">
</EditText>

<EditText android:id="@+id/txt2" 
    android:layout_height="wrap_content"
     android:layout_width="wrap_content"
      android:text="@+id/EditText02" 
      android:editable="false" 
      android:enabled="true"
       android:singleLine="true" 
       android:layout_x="5dip" 
       android:ems="8"
        android:layout_y="69dip">
</EditText>

<Button android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:id="@+id/bb1" 
    android:layout_x="50dip" 
    android:text="Update Currency Rates"
     android:layout_y="120dip"></Button>

<Spinner
    android:id="@+id/spinerr1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_x="182dp"
    android:layout_y="-14dp" />

<Spinner
    android:id="@+id/spinerr2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_x="176dp"
    android:layout_y="47dp" />

</AbsoluteLayout>
4

2 回答 2

1

初始化所有这些值

public Double dUS;// = 0.0;
public Double dEURO;// = 1.0;
public Double dINR;// = 0.0;
public Double dAUD;// = 0.0;
public Double dGBP;// = 0.0;
public Double dILS;// = 0.0;
public Double dTRY;
public Double dRUB;
public Double dJPY;
public Double dMYR;

或者

更改 Doubledouble然后它将采用默认值..

于 2013-11-06T11:21:21.567 回答
0

我猜测异常会在以下行中引发:-

if((dUS * dAUD * dINR * dGBP * dEURO * dTRY * dRUB * dJPY * dMYR) == 0)

所有这些引用在您在这里使用它们之前都已初始化吗?因为我在你的代码中看不到任何初始化的那些。

于 2013-11-06T11:17:11.870 回答