2012-06-17 103 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转换为char,但我可能完全错误。任何帮助表示赞赏。

编辑:我只包含程序的一部分,因为它在我看来有点冗长。数组在此之前被初始化。该部分程序的最终目标是让用户输入10个数字的限制,同时在输入字母或超过10个数字时抛出异常。这是我第一次使用异常,所以我还是比较新,所以请原谅我所做的任何错误。

+0

你在哪里初始化数组'[]'? – alaster

+0

你想读多少位数?也许最好是将所有文本都看作一个大数字,然后转换为数字数组?我认为你永远不会有'NumberFormatException',因为你检查每个字符是否是数字 – alaster

+0

当然,它不会抛出NFE - 如果块会阻止它分析非数字字符,并且永远不会用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并显示错误(如果你不接受减号),并转换成int

之前使用str.trim()
+0

谢谢!它现在抛出NumberFormatException,但现在当它抛出10个元素的ArrayIndexOutOfBoundsException时,它应该允许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