2017-02-03 13 views
0

拋出異常方法我有一個由JButton Actionperformed觸發的Login方法。從方法

private void loginButtonActionPerformed(java.awt.event.ActionEvent evt) { 

    try { 

     Users userData = userDAO.login(Integer.parseInt(loginUserId.getText()), String.valueOf(loginUserPassword.getPassword()));    

    } catch (SQLException ex) { 
     LOGGER.log(Level.SEVERE, ex.toString(), ex); 
     JOptionPane.showMessageDialog(null, "Error SQL: Please Contact your System Administrator", cf.WINDOW_TITLE, JOptionPane.ERROR_MESSAGE); 
    } catch (NullPointerException e) { 
     JOptionPane.showMessageDialog(null, e.getMessage(), cf.WINDOW_TITLE, JOptionPane.ERROR_MESSAGE); 
    } catch (NumberFormatException e) {    
     JOptionPane.showMessageDialog(null, "Pls write a number", cf.WINDOW_TITLE, JOptionPane.ERROR_MESSAGE); 
    } 
} 

這是我的方法,從數據庫中返回一個對象。

public Users login(int userId, String password) throws NumberFormatException, SQLException , NullPointerException { 

    SQL sql = new SQL(); 
    query = sql.createPStatement(cf.SELECT_USER_BY_LOGIN_DATA);   
    query.setInt(1, userId); 
    query.setString(2, password); 
    ResultSet resultSet = query.executeQuery(); 
    try { 
     if (!resultSet.isBeforeFirst()) {    
      throw new NullPointerException("User Not Found"); 
     } 
     while (resultSet.next()) { 
      Users newLoggedUser = new Users(); 
      //Set Object Values 
      return newLoggedUser; 
     } 
    } catch (SQLException e) { 
     LOGGER.log(Level.SEVERE, e.toString(), e); 
     throw e; 
    } 
catch (NullPointerException e) { 
     LOGGER.log(Level.SEVERE, e.toString(), e); 
     throw e; 
    } catch (NumberFormatException e) { 
    LOGGER.log(Level.SEVERE, e.toString(), e); 
     throw e; 
    } finally { 
     SQLUtils.closeQuietly(sql.dbConection()); 
     SQLUtils.closeQuietly(resultSet); 
     SQLUtils.closeQuietly(query);    
    } 
    return null; 
} 

我要顯示多個錯誤信息到用戶accorgding到:找不到

  • 用戶(無SQL結果);
  • 鍵入字母而不是數字
  • SQL錯誤。

我對此有些疑問:

  1. 我應該停止的應用做更多的動作,其中我的結果/對象是NULL,使用throw new NullPointerException("User Not Found");

  2. 安全地使用這些異常發送用戶消息,例如對象爲空(「用戶未找到」),並通過DAO方法拋出它們以被捕獲/顯示JButton ActionPerformed try/Catch?

  3. 我應該在DAO方法中記錄例外情況? ,或者ActionPerformed try/Catch ?.

  4. 我應該再次在DAO方法throw e;ActionPerformed try/Catch捕獲嗎?

像總是非常感謝你的幫助。

+2

你應該幾乎不必趕'NullPointerException'。它表明你(程序員)在正在使用的語言或API方面做了不正確的事情。 –

+2

''拋出新的NullPointerException(「未找到用戶」);「'你不是解引用空引用,這不是正確的例外使用。如何處理'NoSuchElementException'呢? –

+0

「鍵入字母而不是數字」< - 我寧願做一個快速的正則表達式檢查,然後將數據發送到您的查詢函數,而不是依賴於NumberFormatException –

回答

2
  1. IMO處理將創建自己的自定義異常的最佳方式(延伸除外)像

    public class LoginException extends Exception{ 
        public LoginException(Exception cause, String message) { 
        .. 
        } 
    } 
    

可以使用消息參數來定義如何顯示到客戶端。

總結所有可能的登錄例外通過這個的,並宣佈它通過你的數據庫的方法拋出

  • 當然,它的安全。許多程序都這樣做。但最好嘗試向用戶說明問題。

  • 這就要求我們提出一個偏離主題的意見。你可以這樣做。但是,我會在actionPerformed中執行它,因爲按鈕點擊開始「事務」。

  • 相同的答案3

  • +0

    非常感謝!我將編碼類和更新問題。 –

    +0

    如何通過例外?同樣,它需要在LoginException中再次嘗試/ Catched。例如。如果(e.getClass()== NoSuchElementException.class){ JOptionPane.showMessageDialog(null,「User not Found」); } } catch(NoSuchElementException ex){ throw ex; } }' –

    +0

    @JuanSebastianOsorio不。如果您有一個'Exceptional'條件不能繼續(即事務失敗),您就像創建任何其他對象一樣創建新的LoginException,然後拋出它。然後它會冒泡到你的ActionListener,並且你可以在catch塊中做'JOptionPane.showMessageDialog(null,ex.getMessage());' – ControlAltDel