2012-06-17 150 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