2013-06-21 3 views
1

У меня есть строковый ввод из JTextField, он должен быть дробным вводом с числами, разделенными одним «/».Использование try-catch для улавливания ввода строк из JTextField в Java

Мне нужно выбросить ошибку, когда пользователь вводит строку неправильно; пока я могу сопоставить шаблон, но исключение не будет выбрано. Не знаю, что я делаю неправильно, или если есть более простой способ сделать это (хотя мне нужно использовать try-catch);

public void setInputData(String strFrac1, String strFrac2, String oper) 
{ 
String test1, test2; 
test1 = strFrac1; 
test2 = strFrac2; 

try 
{ 
test1.matches("(d+)(p/)(d+)"); 
} 
catch (NumberFormatException e) 
{ 
JOptionPane.showMessageDialog(null, e.getMessage(), "ALERT!", JOptionPane.ERROR_MESSAGE); 
} 


String[] fraction2 = strFrac2.split("/"); 
String[] fraction1 = strFrac1.split("/"); 


    //This will fill up a single array with the numbers and operators we need to use 
    for (int i = 0 ; i <= 1; i++) 
    { 
    fractions[i] = fraction1[i]; 
    if (i == 0 || i == 1) 
    { 
     fractions[i + 2] = fraction2[i]; 
    } 
    } 

    fractions[4] = oper; 

    return(); 
} 

Я использую неправильный улавливатель?

ответ

3
test1.matches("(d+)(p/)(d+)"); 

возвращает булево

вы можете явно исключить исключение

try 
{ 
if(!test1.matches("(d+)(p/)(d+)")) 
    throw new NumberFormatException(); 
} 
catch (NumberFormatException e) 
{ 
JOptionPane.showMessageDialog(null, e.getMessage(), "ALERT!", JOptionPane.ERROR_MESSAGE); 
} 
3

Там нет никаких проблем с линией

test1.matches("(d+)(p/)(d+)"); 

Она возвращает либо true или false. Но не будет ничего exception.

сделать это вы можете проверить логическое значение mathes метода

if(!test1.matches("(d+)(p/)(d+)") 
    // show the dialog 
2

Если вы хотите бросить исключение, если он не соответствует шаблону, то вам нужно, чтобы бросить его в явном виде. Подпись matches методы является

public boolean matches(String regex) 

Это означает, что он будет возвращать true или false

поэтому, если ваш шаблон соответствует входной строке, то он будет возвращать true или он вернется false.

Чтобы решить вашу проблему, вы можете сделать,

if(test1.matches("(d+)(p/)(d+)")){ 
// domeSomething 
}else { 
    throw new NumberFormatException(); 
} 

Это тот случай, когда вы должны использовать try-catch, если вы не хотите использовать его, , то вы можете просто показать MessageDialog следующим

if(test1.matches("(d+)(p/)(d+)")){ 
    //doSomething 
    }else{ 
     JOptionPane.showMessageDialog(null, e.getMessage(), "ALERT!", JOptionPane.ERROR_MESSAGE); 

    }