Ошибка: java.lang.NumberFormatException:

это мой логкэт

12-16 23:29:07.309: W/dalvikvm(3821): threadid=1: thread exiting with uncaught exception (group=0x40018578)
12-16 23:29:07.309: E/AndroidRuntime(3821): FATAL EXCEPTION: main
12-16 23:29:07.309: E/AndroidRuntime(3821): java.lang.NumberFormatException: 
12-16 23:29:07.309: E/AndroidRuntime(3821):     at org.apache.harmony.luni.util.FloatingPointParser.parseDouble(FloatingPointParser.java:267)
12-16 23:29:07.309: E/AndroidRuntime(3821):     at java.lang.Double.parseDouble(Double.java:318)
12-16 23:29:07.309: E/AndroidRuntime(3821):     at com.pmss.FulfillRequest$2.onClick(FulfillRequest.java:111)
12-16 23:29:07.309: E/AndroidRuntime(3821):     at android.view.View.performClick(View.java:2485)
12-16 23:29:07.309: E/AndroidRuntime(3821):     at android.view.View$PerformClick.run(View.java:9080)
12-16 23:29:07.309: E/AndroidRuntime(3821):     at android.os.Handler.handleCallback(Handler.java:587)
12-16 23:29:07.309: E/AndroidRuntime(3821):     at android.os.Handler.dispatchMessage(Handler.java:92)
12-16 23:29:07.309: E/AndroidRuntime(3821):     at android.os.Looper.loop(Looper.java:130)
12-16 23:29:07.309: E/AndroidRuntime(3821):     at android.app.ActivityThread.main(ActivityThread.java:3687)
12-16 23:29:07.309: E/AndroidRuntime(3821):     at java.lang.reflect.Method.invokeNative(Native Method)
12-16 23:29:07.309: E/AndroidRuntime(3821):     at java.lang.reflect.Method.invoke(Method.java:507)
12-16 23:29:07.309: E/AndroidRuntime(3821):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
12-16 23:29:07.309: E/AndroidRuntime(3821):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
12-16 23:29:07.309: E/AndroidRuntime(3821):     at dalvik.system.NativeStart.main(Native Method)

Это мой FulfillRequest.java

public class FulfillRequest extends ActionBarActivity implements OnClickListener {


    EditText parcelidtext, quantitytext, weighttext, typetext;
    Button parcelexistbutton, calculatepaymentbutton;

    JSONArray parcelconfirm = null;
    JSONArray calculate = null;
    private ProgressDialog messageDialog;
    JSONParser jsonParser = new JSONParser();

    private static final String CONFIRM_URL = "http://XXX.XXX.X.XX:1234/PMSS/trackparcel.php";
    private static final String CALCULATE_URL = "http://XXX.XXX.X.XX:1234/PMSS/shipmentcalculate.php";

    // JSON element ids from repsonse of php script:
    private static final String TAG_SUCCESS = "success";
    private static final String TAG_MESSAGE = "message";
    private static final String TAG_POSTS = "posts";
    private static final String TAG_PARCELID = "parcelid";
    private static final String TAG_PARCELSTATUS = "parcelstatus";
    private static final String TAG_PARCELPAYMENT = "parcelpayment";

     private double payment = 0 ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fulfill_request);
        parcelidtext = (EditText) findViewById(R.id.parcelidtext);
        quantitytext = (EditText) findViewById(R.id.quantitytext);
        weighttext = (EditText) findViewById(R.id.weighttext);
        typetext = (EditText) findViewById(R.id.typetext);
        parcelexistbutton = (Button) findViewById(R.id.parcelexistbutton);
        calculatepaymentbutton = (Button) findViewById(R.id.calculatepaymentbutton);

        quantitytext.setEnabled(false);
        weighttext.setEnabled(false);
        typetext.setEnabled(false);

        parcelexistbutton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                String ParcelID = parcelidtext.getText().toString();
                new AttemptSearch(ParcelID).execute();
            }
        });

        calculatepaymentbutton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                String ParcelIDCal = parcelidtext.getText().toString();
                String Quantity = quantitytext.getText().toString();
                String Weight = weighttext.getText().toString();
                String Type = typetext.getText().toString();

                if(ParcelIDCal == "" || Quantity == "" || Weight == "" || Type == ""){
                    new AlertDialog.Builder(FulfillRequest.this).setTitle("Parcel Information")
                    .setMessage("Please fill in all the information first before calculate. ")
                    .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {

                        }
                     })
                    .show();
                }

                else{
                    double weight = Double.parseDouble(Weight); 


                    if(weight > 0.45  || Type == "document"){
                        double baseamount = 4.50;
                        payment = ((baseamount*1.25)*1.06);                     
                    }
                    else if(weight > 0.45 || Type == "parcel"){
                        double baseamount = 5.00;
                        payment = ((baseamount*1.25)*1.06);
                    }

                    String Payment = Double.toString(payment);
                    new AttemptCalculate(ParcelIDCal,Quantity,Weight,Type,Payment).execute();
                }
            }
        });
    }

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    private void setupActionBar() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            getActionBar().setDisplayHomeAsUpEnabled(true);
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.fulfill_request, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:

            NavUtils.navigateUpFromSameTask(this);
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

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

    }

    class AttemptSearch extends AsyncTask<String, String, Integer> {

        private final String TAG = null;
        boolean failure = false;
        String message;
        String ParcelID, parcelid;
        int success;

        public AttemptSearch(String ParcelID) {
            this.ParcelID = ParcelID;
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            messageDialog = new ProgressDialog(FulfillRequest.this);
            messageDialog.setMessage("Attempting checking...");
            messageDialog.setIndeterminate(false);
            messageDialog.setCancelable(true);
            messageDialog.show();

        }

        protected Integer doInBackground(String... args) {

            try {
                // Building Parameters
                List<NameValuePair> params = new ArrayList<NameValuePair>();
                params.add(new BasicNameValuePair("parcelid", ParcelID));

                Log.d("check!", "starting");
                // getting product details by making HTTP request
                JSONObject json = jsonParser.makeHttpRequest(CONFIRM_URL, "POST",
                        params);
                // check your log for json response
                Log.d("Checking attempt", json.toString());

                // json success tag
                success =json.getInt(TAG_SUCCESS);
                message= json.getString(TAG_MESSAGE);

                if(success == 1){
                    Log.d("Retrieve Successful!", "message: " + message);
                    parcelconfirm = json.getJSONArray(TAG_POSTS);
                    JSONArray jr = parcelconfirm.getJSONArray(0);
                    JSONObject jb = jr.getJSONObject(0);
                    parcelid = jb.getString(TAG_PARCELID);
                }
                else if(success == 0){
                    Log.d("Retrieve Failed!", "message: " + message);
                }

            } catch (JSONException e) {
                Log.e(TAG, "JSON error", e);
                success = Integer.valueOf(0);
            }
            return success;

        }

        protected void onPostExecute(Integer success) {
            // dismiss the dialog once product deleted
            messageDialog.dismiss();

            if (success != null && success == 1) {
                quantitytext.setEnabled(true);
                weighttext.setEnabled(true);
                typetext.setEnabled(true);
                Toast.makeText(
                        FulfillRequest.this,
                        message == null ? "Please enter parcel ID  (success)"
                                : message, Toast.LENGTH_LONG).show();
            } 
            else {
                parcelidtext.setText(null);
                Toast.makeText(
                        FulfillRequest.this,
                        message == null ? "Please enter parcel ID  (failed)"
                                : message, Toast.LENGTH_LONG).show();
            }

        }
    }

    class AttemptCalculate extends AsyncTask<String, String, Integer> {

        private final String TAG = null;
        boolean failure = false;
        String message;
        String ParcelID, Quantity, Weight, Type, Status = "paid", Payment;
        String parcelstatus,parcelpayment;
        int success;

        public AttemptCalculate(String ParcelID, String Quantity, String Weight, String Type, String Payment) {
            this.ParcelID = ParcelID;
            this.Quantity = Quantity;
            this.Weight = Weight;
            this.Type = Type;
            this.Payment = Payment;
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            messageDialog = new ProgressDialog(FulfillRequest.this);
            messageDialog.setMessage("Attempting calculating...");
            messageDialog.setIndeterminate(false);
            messageDialog.setCancelable(true);
            messageDialog.show();

        }

        protected Integer doInBackground(String... args) {

            try {
                // Building Parameters
                List<NameValuePair> params = new ArrayList<NameValuePair>();
                params.add(new BasicNameValuePair("parcelid", ParcelID));
                params.add(new BasicNameValuePair("parcelquantity", Quantity));
                params.add(new BasicNameValuePair("parcelweight", Weight));
                params.add(new BasicNameValuePair("parceltype", Type));
                params.add(new BasicNameValuePair("parcelpayment", Payment));
                params.add(new BasicNameValuePair("parcelstatus", Status));

                Log.d("request!", "starting");
                // getting product details by making HTTP request
                JSONObject json = jsonParser.makeHttpRequest(CALCULATE_URL, "POST",
                        params);
                // check your log for json response
                Log.d("Tracking attempt", json.toString());

                // json success tag
                success =json.getInt(TAG_SUCCESS);
                message= json.getString(TAG_MESSAGE);

                if(success == 1 ){
                    Log.d("Retrieve Successful!", "message: " + message);
                    calculate = json.getJSONArray(TAG_POSTS);
                    JSONArray jr = calculate.getJSONArray(0);
                    JSONObject jb = jr.getJSONObject(0);
                    parcelpayment = jb.getString(TAG_PARCELPAYMENT);
                    parcelstatus = jb.getString(TAG_PARCELSTATUS);
                }
                else if(success == 0){
                    Log.d("Retrieve Failed!", "message: " + message);
                }

            } catch (JSONException e) {
                Log.e(TAG, "JSON error", e);
                success = Integer.valueOf(0);
            }
            return success;

        }

        protected void onPostExecute(Integer success) {
            // dismiss the dialog once product deleted
            messageDialog.dismiss();
            if (success != null && success == 1) {              
                    new AlertDialog.Builder(FulfillRequest.this).setTitle("Parcel Information")
                    .setMessage(" Your Parcel Status is " + parcelstatus + ". Your Payment Amount is RM" + parcelpayment + ". ")
                    .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            parcelidtext.setText(null);
                            quantitytext.setText(null);
                            quantitytext.setEnabled(false);                         
                            weighttext.setText(null);
                            weighttext.setEnabled(false);
                            typetext.setText(null);                                                     
                            typetext.setEnabled(false);
                        }
                     })
                    .show();
                Toast.makeText(
                        FulfillRequest.this,
                        message == null ? "Please enter parcel ID  (success)"
                                : message, Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(
                        FulfillRequest.this,
                        message == null ? "Please enter parcel ID  (failed)"
                                : message, Toast.LENGTH_LONG).show();
            }

        }
    }
}

Почему это сообщение об ошибке появляется у меня? Что я должен делать? Я думаю, что, возможно, это из-за моей двойной переменной веса.

строка 111 double weight = Double.parseDouble(Weight); в этом методе calculatepaymentbutton.setOnClickListener(new View.OnClickListener()

Интересно, есть ли способ устранить эту проблему? Причина того, что я хочу сделать, это то, что когда я нажимаю кнопку расчета платежа, я хочу, чтобы моя система проверяла, все ли EditText заполнено или нет, но когда я нажимаю на нее, возникает эта ошибка logcat ~


person Jiazzy user    schedule 16.12.2013    source источник
comment
критическая ошибка: Type == "document"   -  person jmj    schedule 16.12.2013
comment
Таким образом, система не может интерпретировать любое значение в Weight как двойное. Это произойдет, если значение, например, "sup dog" или "I like pizza". Самый простой подход — поймать NumberFormatException и обработать его так же, как и недопустимый ввод.   -  person Taylor    schedule 16.12.2013
comment
тип ввода для EditText weighttextnumberDecimal   -  person Jiazzy user    schedule 16.12.2013
comment
Что я должен делать? потому что мне нужно подтвердить, что тип посылки является документом или посылкой, потому что расчет для этих сборов отличается   -  person Jiazzy user    schedule 16.12.2013


Ответы (2)


Эти сравнения являются частью проблемы:

if (ParcelIDCal == "" || Quantity == "" || Weight == "" || Type == "")

Они должны быть:

if (ParcelIDCal == null || ParcelIDCal.trim().equals("") ||
    Quantity == null || Quantity.trim().equals("") ||
    Weight == null || Weight.trim().equals("") ||
    Type == null || Type.trim().equals(""))

И все части, где вы сравниваете такие строки, неверны:

Type == "document"

Это не то, как вы сравниваете Strings для равенства в Java, вы должны использовать:

Type.equals("document")

Или еще лучше, чтобы учесть возможность того, что переменная null лучше сделать так:

"document".equals(Type)

И кстати - переменные и атрибуты в Java должны начинаться со строчной буквы, так принято.

person Óscar López    schedule 16.12.2013
comment
ParcelIDCal.trim().equals("") означает .trim()? - person Jiazzy user; 16.12.2013
comment
@Jiazzyuser для удаления всех пробелов вокруг строки. Строка, состоящая только из пробелов, также должна считаться пустой. - person Óscar López; 16.12.2013
comment
Значит, если я по ошибке нажму пробел в тексте редактирования, он примет пустой текст, верно? - person Jiazzy user; 16.12.2013
comment
@Jiazzyuser да. Кроме того, вы всегда должны trim() удалять все введенные пользователем данные, рекомендуется удалить эти лишние пробелы. Например, эта строка: " 2 " вызовет ошибку исключения синтаксического анализа при попытке преобразовать ее в число из-за лишних пробелов. - person Óscar López; 16.12.2013
comment
Но в основном я выполняю обработку ошибок, например, EditText пуста или нет в моем PHP-скрипте. Даже я помещаю это условие в свой java-файл, как только он обнаруживает, что какое-то поле не заполнено, мне нужно остановить его от продолжения действия в php-скрипт ? - person Jiazzy user; 16.12.2013
comment
Потому что в php, когда я тестирую обработку ошибок, если что-то пойдет не так, он умирает с сообщением, но как я это делаю в java? - person Jiazzy user; 16.12.2013
comment
я знаю, что переменная должна начинаться со строчной буквы, в любом случае это моя ошибка, но дело в том, что мне нужно сначала получить эту работу. - person Jiazzy user; 16.12.2013
comment
@Jiazzyuser, это не имеет значения. Что вы должны сделать, это продезинфицировать ввод, убедиться, что он не нулевой и непустой, прежде чем использовать его. Вот о чем мой ответ, не имеет значения, откуда он взят, даже если он из PHP. И если вам случится ввести нечисловое значение в виде строки в числовое поле, конечно, будет выдано исключение синтаксического анализа, поэтому вы должны окружить код в try/catch и что-то сделать с этим в catch - person Óscar López; 16.12.2013
comment
хм .. вот почему для числового поля я установил его, который может вставлять только числовое число - person Jiazzy user; 16.12.2013

Если вы хотите использовать строки, используйте:

"".equals(ParcelIDCal)

или даже лучше, чтобы проверить, является ли строка пустой или пустой:

StringUtils.isNotBlank(ParcelIDCal)
person BobTheBuilder    schedule 16.12.2013
comment
StringUtils нужно что-то объявить? Я спросил это, потому что там написано StringUtils cannot be resolved - person Jiazzy user; 16.12.2013
comment
Да. вам нужно импортировать его: import org.apache.commons.lang.StringUtils; - person BobTheBuilder; 16.12.2013
comment
Когда я импортирую библиотеку, она говорит The import org.apache.commons.lang cannot be resolved - person Jiazzy user; 16.12.2013
comment
Класс StringUtils является частью библиотек Apache Commons. Вы можете получить банку здесь: commons.apache.org (получите компонент Common Lang). - person Kloe2378231; 16.12.2013