2016-07-21 66 views
1

所以我必須編寫一個程序,提示用戶輸入一個密碼,該密碼必須符合三個要求:至少8個字符,只有字母和數字,至少有兩個數字。現在我創建的方法是檢查這三個要求,我相信它是正確的,但是我的程序還必須執行一些異常處理,並且如果其中一個要求關閉,可以要求用戶重新輸入密碼,並將相應的錯誤消息顯示爲遵循每個要求。我創建了一個字符串errorMessage來傳遞該消息,但是當我嘗試在我的主目錄中調用它時,它給了我一個錯誤?Java JPasswordField

我的另一個問題是密碼必須通過使用JPasswordField接收到我的程序中,但由於其他因素,比如我閱讀的JPanel,按鈕和動作事件等衆多因素,我甚至都在苦苦掙扎。沿着這個走。我試圖使用JPasswordField,並注意到接受密碼的行將它作爲數組,當我的checkPassword方法需要一個字符串時,我如何將該密碼作爲字符串取而代之?

這是我有我的計劃至今:

import java.awt.event.ActionListener; 
    import javax.swing.JFrame; 
    import javax.swing.JLabel; 
    import javax.swing.JOptionPane; 
    import javax.swing.JPasswordField; 

    import javafx.event.ActionEvent; 

public class Ed10Chp6Ex6Point18CheckPasswordProgram { 

public static void main(String[] args) { 

    final JFrame frame = new JFrame("Check Password Program"); 
    JLabel jlbPassword = new JLabel("Please enter the password: "); 
    JPasswordField jpwName = new JPasswordField(15); 
    jpwName.setEchoChar('*'); 
    jpwName.addActionListener(new ActionListener()) { 

     public void actionPerformed(ActionEvent e) { 
      JPasswordField input = (JPasswordField) e.getSource(); 
      char[] password = input.getPassword(); 

      if(checkPassword(password)){ 
       JOptionPane.showMessageDialog(frame, "Congradulations, your password follows all the requirements"); 
      } 
      else{ 
       JOptionPane.showMessageDialog(frame, errorMessage); 
      } 
     } 
    } 
} 

public static boolean checkPassword(String x) { 

    String errorMessage = ""; 

    //must have at least eight characters 
    if (x.length() < 8){ 
     errorMessage = "The password you entered is invalid, password must be at least 8 characters"; 
     return false; 
    } 

    //consists of only letters and digits 
    for (int i = 0; i < x.length(); i++) { 
     if (!Character.isLetter(x.charAt(i)) && !Character.isDigit(x.charAt(i))) { 
      errorMessage = "The password you entered is invalid, password must contain only letters and digits"; 
     return false; 
     } 
    } 

    //must contain at least two digits 
    int count = 0; 
    for (int i = 0; i < x.length(); i++) { 
     if (Character.isDigit(x.charAt(i))){ 
     count++; 
     } 
    } 

    if (count >= 2){ 
     return true; 
    } 
    else { 
     errorMessage = "The password you entered is invalid, password must contain at least two digits"; 
     return false; 
    } 
} 
} 

我在先進的情況下,道歉我的一些問題顯得簡陋,任何幫助將不勝感激,謝謝!

+0

你試過了嗎?String pass = new String(password);' –

+0

哦哇,謝謝!把它放在char []密碼行後面,錯誤消失。你會碰巧知道爲什麼errorMessage的調用會出錯嗎? –

+0

'errorMessage'未在'JOptionPane.showMessageDialog(frame,errorMessage)範圍內定義;' –

回答

1

我怎麼可以在該密碼作爲一個字符串,而不是

無論是checkPassword(new String(input.getPassword))或更新你的方法接受一個char[]而不是字符串。

至於錯誤檢查,例如,在執行像ShortPasswordException extends Exception這樣的類之後,您應該使用throw new ShortPasswordException(),在那裏您要拋出該錯誤。

然後,您可以更冒險做

try { 
    checkPassword(); 
} catch (ShortPasswordException e) { 
    // TODO: Handle exception 
} 

提示:使用正則表達式來檢查你的密碼要求。例如,\d{2}的匹配表示您有兩個連續的數字。

1

兩件事情馬上蝙蝠:

(1)確保您輸入正確的類,不依賴於一個IDE做適當進口。您正在從JavaFX導入ActionEvent類,但您正在使用的框架是Swing。

變化

import javafx.event.ActionEvent; 

import java.awt.event.ActionEvent; 

我不是很熟悉,彼此發揮如何很好地JavaFX和Swing,而且使用了正確的類通常有助於避免頭痛和編譯/運行時錯誤。

(2)java.lang.String類中的靜態方法提供了將char數組轉換爲字符串的便捷方法。在您的actionPerformed方法中,加上:

String passStr = String.valueOf(password); 

E.g.

@Override 
public void actionPerformed(ActionEvent e) { 
    // Get the source of the event, we know it is a JPasswordField so we cast it. 
    JPasswordField input = (JPasswordField) e.getSource(); 
    // Get the char array from the input the user typed stored in the input object. 
    char[] password = input.getPassword(); 
    // Convert char[] to String 
    String passwordStr = String.valueOf(password); 
    if(checkPassword(passwordStr)){ 
     JOptionPane.showMessageDialog(frame, "Congradulations, your password follows all the requirements"); 
    } else { 
     JOptionPane.showMessageDialog(frame, errorMessage); 
    } 
} 
相關問題