Исключение и выражения

Я реализую серию утверждений для того, чтобы в моем формуляре в Java только были позволено вмешиваться правильные и логические данные.

Данные, которых нужно вводить:

- potencia (int)
- consumo (double)

Код Validaciones.java (регулярные выражения):

public static boolean validarConsumo(String consumo){
        Pattern pat = Pattern.compile("^[0-9]+([,\\.][0-9]*)?$");
        Matcher mat = pat.matcher(consumo);
        if (mat.matches()) {
            return true;
        } else {
            return false;
        }
    }

    public static boolean validarPotencia(String potencia){
        Pattern pat = Pattern.compile("^[0-9]{1,3}$");
        Matcher mat = pat.matcher(potencia);
        int n = Integer.parseInt(potencia);
        if ((mat.matches()) && (n>39 && n<501)) { //>=40 && <=500
            return true;
        } else {
            return false;
        }
    }

Код Формуларио.хава [ОБНОВЛЕННЫЙ] (JFrame)

private void button_OKActionPerformed(java.awt.event.ActionEvent evt) {                                          
        //Atributos generales para todo tipo de vehículos.
        String bastidor = textfield_bastidor.getText();
        int marca = combobox_marcas.getSelectedIndex() + 1;
        String matricula = textfield_matricula.getText();
        String modelo = (String) combobox_modelos.getSelectedItem();
        String color = (String) combobox_color.getSelectedItem();
        int potencia = Integer.parseInt(textfield_potencia.getText());
        double consumo = Double.parseDouble(textfield_consumo.getText());
        String descripcion = textfield_descripcion.getText();
        try {
            if (!Validaciones.validarBastidor(bastidor)) {
                throw new Exception("Formato de bastidor incorrecto.");
            }
            if (!Validaciones.validarMatricula(matricula)) {
                throw new Exception("Formato de matrícula incorrecta.");
            }
            if (!Validaciones.validarDescripcion(descripcion)) {
                throw new Exception("Formato de descripción incorrecta.");
            }

            if (!Validaciones.validarPotencia(String.valueOf(potencia))) {
                throw new Exception("Formato de potencia incorrecta.");
            }
            if (!Validaciones.validarConsumo(String.valueOf(consumo))) {
                throw new Exception("Formato de consumo incorrecto.");
            }

            //Excepción por si el valor introducido no es un entero.
            potencia = 0;
            try {
                potencia = Integer.parseInt(textfield_potencia.getText());
            } catch (NumberFormatException nfe_potencia) {
                nfe_potencia.getMessage();
            }

            //Excepción por si el valor introducido no es un double.
            consumo = 0.0;
            try {
                consumo = Double.parseDouble(textfield_consumo.getText());
            } catch (NumberFormatException nfe_consumo) {
                nfe_consumo.getMessage();
            }

            //Evitamos formatear la fecha cuando el valor del campo textfield_fecha_fabricacion sea nulo o vacío.
            Date f = null;
            if (!textfield_fecha_fabricacion.getText().equals("")) {
                String fecha_fabricacion = textfield_fecha_fabricacion.getText();
                //Damos formato a la fecha a insertar. Por ejemplo: 2010/10/10.
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
                try {
                    //Convertimos a Date la fecha recogida como String.
                    f = sdf.parse(fecha_fabricacion);
                } catch (ParseException ex) {
                    Logger.getLogger(Alta_vehiculo.class.getName()).log(Level.SEVERE, null, ex);
                }
            }

            //Comprobamos que están todos los datos insertados...
            if (!textfield_bastidor.getText().isEmpty() && !textfield_consumo.getText().isEmpty()
                    && !textfield_descripcion.getText().isEmpty() && !textfield_fecha_fabricacion.getText().isEmpty()
                    && !textfield_matricula.getText().isEmpty() && !textfield_potencia.getText().isEmpty()
                    && !textfield_precio.getText().isEmpty() && !textfield_precio.getText().isEmpty()) {
                //Comprobamos si el bastidor no existe en la base de datos...
                if (!Conexiones.cargar_bastidores().contains(textfield_bastidor.getText())) {
                    //Depende de qué radiobutton pulsemos...
                    if (radiobutton_alquiler.isSelected()) {
                        //Excepción por si el valor introducido no es un double.
                        double precio = 0.0;
                        try {
                            precio = Double.parseDouble(textfield_precio.getText());
                        } catch (NumberFormatException nfe_precio) {
                            nfe_precio.getMessage();
                        }
                        boolean disponible = checkbox_disponible.isSelected();
                        Vehiculo va = new Vehiculo_Alquiler(precio, true, bastidor, color, matricula, modelo,
                                marca, potencia, consumo, f, descripcion);
                        //Llamamos al método alta_vehiculo() para insertar el vehículo en la base de datos.
                        Conexiones.alta_vehiculo(va);
                    } else {
                        //Excepción por si el valor introducido no es un double.
                        double precio = 0.0;
                        try {
                            precio = Double.parseDouble(textfield_precio.getText());
                        } catch (NumberFormatException nfe_precio) {
                            nfe_precio.getMessage();
                        }
                        Vehiculo vc = new Vehiculo_Compra(precio, null, bastidor, color, matricula, modelo,
                                marca, potencia, consumo, f, descripcion);
                        //Llamamos al método alta_vehiculo() para insertar el vehículo en la base de datos.
                        Conexiones.alta_vehiculo(vc);
                        dispose();
                    }
                } else {
                    JOptionPane.showMessageDialog(null, "¡¡¡Este bastidor ya EXISTE en la base de datos!!!", "ATENCIÓN ADMINISTRADOR", JOptionPane.WARNING_MESSAGE);
                    textfield_bastidor.requestFocus();
                }
            } else {
                JOptionPane.showMessageDialog(null, "¡¡¡Debes rellenar TODOS los campos!!!", "ATENCIÓN ADMINISTRADOR", JOptionPane.WARNING_MESSAGE);
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e.getMessage(), "ATENCIÓN ADMINISTRADOR", JOptionPane.WARNING_MESSAGE);
        }
    } 

Моя проблема:

- Если я оставляю пустые поля, отпусти исключение. Не работает.

- Если вставленный текст ("он должен отпускать ошибку") в полях, он отпускает исключение. Не работает.

ОШИБКА:

run:
Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "debe saltar error"
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043)
    at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
    at java.lang.Double.parseDouble(Double.java:538)
1
задан 21.04.2017, 19:28
0 ответов

Оба метода

public static boolean validarConsumo(String consumo){

и

public static boolean validarPotencia(String potencia){

они должны получать стоимость числового String, так как они внутри реализуют превращение, если стоимость, которую они получают, не númericos, получается ошибка:

java.lang. NumberFormatException: For неудар в лунку string: "....

Перед тем, как называть методы ты мог бы санкционировать, если цепь - númerica посредством метода например:

public static boolean isNumeric(String str){  
  try  
  {  
    double d = Double.parseDouble(str);  
  }catch(NumberFormatException nfe){  
    return false;  
  }  
  return true;  
}

Ты реализовал бы утверждение, чтобы определять, если это стоимость númerico перед тем, как называть методы:

if(isNumeric(valorConsumo)){
   // llama validarConsumo(String valorConsumo)
}

if(isNumeric(valorPotencia)){
   // llama validarPotencia(String valorPotencia)
}

Обновление: Твой код мог бы быть сведенным к (используя метод isNumeric() предложенный):

private void button_OKActionPerformed(java.awt.event.ActionEvent evt) {

int potencia;    
double consumo;

if(isNumeric(textfield_potencia.getText()){
    potencia = Integer.parseInt(textfield_potencia.getText());
}else{
    //Excepción por si el valor introducido no es un entero.
        potencia = 0;
}


if(isNumeric(textfield_consumo.getText()){
    consumo = Double.parseDouble(textfield_consumo.getText());
}else{
 //Excepción por si el valor introducido no es un double.
        consumo = 0.0;
}


        //Aqui resto del código (inserciones en la base de datos, actualizaciones de tablas, etc...).
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, e.getMessage(), "ATENCIÓN ADMINISTRADOR", JOptionPane.WARNING_MESSAGE);
    }
}
2
ответ дан 03.12.2019, 17:38
  • 1
    Я продолжаю иметь ту же проблему. Я только что ИЗДАЛ мой có я говорю. ¿ Có mo serí в solució n? –  18.01.2017, 10:25
  • 2
    Добавила actualizació n, твой mé все может быть уменьшенным много má s, с этим у тебя не должна быть проблема. –  18.01.2017, 19:24
  • 3
    Он следует за мной, не функционируя. Я обновляю с моим có я говорю настоящий. –  19.01.2017, 01:26
  • 4
    @omaza1990......... ты реализовал то, что я комментирую в моем actualizació n??? ты использовал mé все, кого я предлагаю isNumeric ()??? –  19.01.2017, 01:39
  • 5
    Если, и ошибка. Не, потому что мне продолжает давать та же ошибка. Пробуй с моим có я говорю, что я завершаю находить, где эта ошибка, потому что я схожу с ума, принесла весь dí в для этой " chorrada". Конечно, что это слабая ошибка. –  19.01.2017, 01:40

Код твоего класса Formulario начнись с:

   int potencia = Integer.parseInt(textfield_potencia.getText());
   double consumo = Double.parseDouble(textfield_consumo.getText());

Оба метода стараются конвертировать текст, введенный в компьютер в числовую стоимость и в случае твоих примеров они бросают один NumberFormatException. В твоих данных примерах никогда ты не прибываешь в код с утверждением, тогда твой код делает точно ue было бы возможно ждать. Утверждение тогда было бы должно делаться перед тем, как использовать parseInt или parseDouble, или ты был бы должен относиться просто к parse и потом в утверждении подтверждать, находится ли стоимость внутри пределов.

В утверждении потребления только ты подтверждаешь, - числовое ли потребление. Методы parseInt и parseDouble уже они делают это для тебя просто так собственный код. В силе более сверху ты подтверждаешь, - ли стоимость внутри разрешенного ранга.

Я рекомендую следующее для утверждения:

private void button_OKActionPerformed(java.awt.event.ActionEvent evt) {
    try{
        potencia = Integer.parseInt(textfieldPotencia.getText());
        if (!validatePotencia(potencia)) throw new NumberFormatException("fuera de rango");
        // aquí tiene que ser NumberFormatException, no NumberformatException
    } catch (NumberFormatException nfe){
        JOptionPane.showMessageDialog(null, e.getMessage(), "ATENCIÓN ADMINISTRADOR", JOptionPane.WARNING_MESSAGE);
        return;
    }

    try{
        consumo = Integer.parseInt(textfieldPotencia.getText());
        // consumo no necesita cumplir con mas que ser un `Double` valido;
        // aquí lo mismo
    } catch (NumberFormatException nfe){
        JOptionPane.showMessageDialog(null, e.getMessage(), "ATENCIÓN ADMINISTRADOR", JOptionPane.WARNING_MESSAGE);
        return;
    }

    // luego el código para procesar los datos ingresados;
}

с методом, чтобы санкционировать силу:

public static boolean validarPotencia(int potencia){
    return (potencia>39 && potencia<501);
}

Меньше код, более простой, более очевидный для других.

2
ответ дан 03.12.2019, 17:38
  • 1
    ¿ Ты имеешь в виду делать сначала утверждения и потом превращения? А именно (saldrá совсем продолженный, но я надеюсь, что понимают): int улучши = Integer.parseInt (textfield_potencia.getText ()); double я трачу = Double.parseDouble (textfield_consumo.getText ()); try { if (! Validaciones.validarPotencia (String.valueOf (сила))) { throw new Exception (" Формат incorrecto."); } if (! Validaciones.validarConsumo (String.valueOf (потребление))) { throw new Exception (" Формат incorrecto."); } –  18.01.2017, 10:59
  • 2
    Тебя добавила explicació n в ответ. –  18.01.2017, 17:15
  • 3
    Я это чувствую, но оно я не функционирует, я издаю. –  19.01.2017, 01:26
  • 4
    Привет, ты это использовал такого которого скопированного? Recié n я понял, что у меня есть период времени ortografí в в имени класса в коде, но если ты это это использовал в каком-то IDE ты deberí чтобы возразить. Я издаю это тебе. –  19.01.2017, 01:36
  • 5
    Я это использовал в IDE Netbeans, но мне продолжает давать ту же ошибку For неудар в лунку string: ".... –  19.01.2017, 01:40

Теги

Похожие вопросы