2012-06-17 3 views
0

Так что я пытался понять это, но безрезультатно. Мне нужно преобразовать JTextField в массив int, имея два исключения: NumberFormatException и ArrayIndexOutOfBoundsException. Я смог найти способ его преобразования, но при вводе букв он не будет бросать исключение NumberFormatException.Преобразование JTextField в массив int с исключениями

try { 
    int j=0; 
    String str = "" + numbersField.getText(); 
    char digit[] = str.toCharArray(); 
     for (int i=0; i<digit.length; i++) { 
      if (Character.isDigit(digit[i])) { 
       array[j]=Character.getNumericValue(digit[i]); 
       System.out.print(array[j] + " "); //Checking if it works 
       ++j; 
      } 
     } 
    } catch (NumberFormatException e1) { 
     System.err.println("NumberFormatException: Array can only hold integers"); 

    } catch (ArrayIndexOutOfBoundsException e1) { 
       System.err.println("ArrayIndexOutOfBoundsException: Array can only hold up to 10 elements"); 
    } 

Лично я считаю, что это не бросает NumberFormatException, потому что он преобразует JTextField в уголь, но я мог бы быть совершенно неправильно. Любая помощь приветствуется.

EDIT: Я включил только часть программы, так как это, по-моему, длительное время. Перед этим инициализируется массив. Конечная цель этой части программы состоит в том, чтобы пользователь вводил предел в 10 номеров, бросая исключение, если вводится буква или превышает 10 чисел. Это мой первый раз, когда я использовал исключения, поэтому я по-прежнему относительно новичок, поэтому, пожалуйста, извините меня за любые ошибки, которые я сделал.

+0

где вы инициализировать 'массив []'? – alaster

+0

Сколько цифр вы хотите прочитать? возможно, было бы лучше прочитать весь текст как одно большое число, а затем преобразовать в массив цифр? Я думаю, что у вас никогда не будет 'NumberFormatException', потому что вы проверяете, является ли каждый символ цифрой – alaster

+0

Конечно, он не будет бросать NFE - ваш блок if не позволит ему анализировать символы, отличные от цифр, и вы никогда не будете разбираться с исключением NumberFormatException бросая метод. –

ответ

2

Вы можете проверить, есть ли всего текста только цифры, а затем преобразовать текст в int, а затем поместить все цифры в массив.

Попробуйте альтернативу:

String str = numbersField.getText(); 

try { 
    int value = Integer.parseInt(str); 

    int[] array = new int[str.lenght - 1]; 
    j = array.length - 1; 
    while (value > 0) { 
     array[j] = value % 10; 
     value /= 10; 
     --j; 
    } 

} catch (NumberFormatException ex) { 
    System.out.println("Enter only digits!") 
} 

UPD: Также вам нужно проверить, если value < 0 и показать ошибку (если вы не согласны с минуса) и использовать str.trim() перед преобразованием в Int

+0

Спасибо! Теперь он выдает NumberFormatException, но теперь, когда он выдает исключение ArrayIndexOutOfBoundsException в 10 элементах, он должен разрешить 10 и бросить его после 11. Я пытался испортить то, что вы дали, но ничего. Я продолжу изучать. Еще раз спасибо! – user1462300

1

Ммм хорошо, возможно, это может помочь, может быть не самым эффективным, но делает свою работу:

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JTextField; 

public class JTextFieldIntToArrayValidation extends JFrame { 

    private int[] integerArray; 
    private JButton button; 
    private JTextField tf; 

    public JTextFieldIntToArrayValidation() { 
     createAndShowUI(); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       JTextFieldIntToArrayValidation test = new JTextFieldIntToArrayValidation(); 
       test.setVisible(true); 
      } 
     }); 
    } 

    private void createAndShowUI() { 
     setTitle("Converting JTextField to an int array with exceptions"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationRelativeTo(null); 
     addComponentsToPane(); 
     addListeners(); 
     pack(); 
     tf.grabFocus(); 
    } 

    private void addComponentsToPane() { 
     button = new JButton("Convert JTextfield to array"); 
     tf = new JTextField(10); 
     getContentPane().add(tf, BorderLayout.EAST); 
     getContentPane().add(button, BorderLayout.WEST); 
    } 

    private void addListeners() { 
     button.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent ae) { 
       String tmp = tf.getText(); 
       char[] chars = tmp.toCharArray(); 
       integerArray = new int[chars.length]; 

       try { 

        if (integerArray.length > 10) {//if digits entered are greater then 10. This however only allows for single digits!!! 
         throw new ArrayIndexOutOfBoundsException("Array cannot be larger then 10: " + integerArray.length); 
        } 
        for (int i = 0; i < tmp.length(); i++) { 
         if (!Character.isLetter(chars[i])) {//if its not a letter 
          integerArray[i] = Integer.parseInt(chars[i] + "");//stops java handling chars as ints 
         } else {//its a letter 
          throw new NumberFormatException("Only valid integers must be entered no letters: " + chars[i]); 
         } 
        } 
        printArray(); 
       } catch (NumberFormatException | ArrayIndexOutOfBoundsException ex) { 
        JOptionPane.showMessageDialog(getContentPane(), ex.getMessage()); 
       } 
      } 
     }); 
    } 

    private void printArray() { 
     for (int i : integerArray) { 
      System.out.println(i); 
     } 
    } 
} 
+0

Вау, это было больше, чем я ожидал, но спасибо! Я смог включить actionPerformed раздел вашей программы в мой, и он работал как шарм! Я не знал, что вы можете использовать подобные исключения, профессор никогда не переходил на это. Благодаря! – user1462300

Смежные вопросы