Java 从方法中抛出异常方法

Java 从方法中抛出异常方法,java,exception,exception-handling,nullpointerexception,Java,Exception,Exception Handling,Nullpointerexception,我有一个由JButton Actionperformed触发的登录方法 private void loginButtonActionPerformed(java.awt.event.ActionEvent evt) { try { Users userData = userDAO.login(Integer.parseInt(loginUserId.getText()), String.valueOf(loginUserPassword.getPassword()))

我有一个由JButton Actionperformed触发的登录方法

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;
}  
我必须根据以下内容向用户显示多条错误消息:

  • 未找到用户(无SQL结果)
  • 键入字母而不是数字
  • SQL错误
我对此有一些疑问:


  • 如果我的结果/对象为
    NULL
    ,我是否应该停止应用程序执行更多操作,使用
    抛出新的NullPointerException(“未找到用户”)

  • 可以安全地使用这些异常来发送用户消息,比如在对象为null(“用户未找到”)的情况下,并通过DAO方法抛出这些消息,以便通过
    JButton ActionPerformed try/Catch?

  • 在DAO方法中,我应该在哪里记录异常,还是尝试/捕获

  • 我应该
    抛出e再次在DAO方法中被
    actionperformedtry/Catch
    捕获

  • 像往常一样,非常感谢你的帮助

  • IMO最好的处理方法是创建自己的自定义异常(扩展异常),如

  • 您可以使用message参数指定要向客户端显示的内容

    将所有可能的登录异常都包装到这里,并声明它是由DB方法引发的

  • 当然,很安全。很多程序都是这样做的。但最好尝试向用户澄清问题

  • 这要求我们陈述一个观点,这是离题的。你可以用任何一种方法。但是我,我会在actionPerformed中这样做,因为点击按钮会启动“事务”

  • 答案和3相同

  • IMO最好的处理方法是创建自己的自定义异常(扩展异常),如

  • 您可以使用message参数指定要向客户端显示的内容

    将所有可能的登录异常都包装到这里,并声明它是由DB方法引发的

  • 当然,很安全。很多程序都是这样做的。但最好尝试向用户澄清问题

  • 这要求我们陈述一个观点,这是离题的。你可以用任何一种方法。但是我,我会在actionPerformed中这样做,因为点击按钮会启动“事务”

  • 答案和3相同



  • 您几乎不需要捕获
    NullPointerException
    。它表示您(程序员)正在对所使用的语言或API执行错误的操作。
    “抛出新的NullPointerException(“未找到用户”);”
    如果您没有取消对null引用的引用,则不应使用此异常。不如换一个
    NoTouchElementException
    “用字母代替数字”@谢谢你,到目前为止,我是一个初级程序员,正在尽力做到最好。
    抛出新的NullPointerException(“未找到用户”)
    将停止程序以读取所有方法代码,但如果没有必要,我将删除它。我还没有看到
    NoTouchElementException
    ,非常感谢您的提醒。@Andy Turner这是怎么回事,我不知道。因为对象为空,如果我没有捕捉到
    NullPointerExpection
    ,程序就会崩溃。你有什么例子能让我走上正确的道路吗。谢谢。您几乎不需要捕捉
    NullPointerException
    。它表示您(程序员)正在对所使用的语言或API执行错误的操作。
    “抛出新的NullPointerException(“未找到用户”);”
    如果您没有取消对null引用的引用,则不应使用此异常。不如换一个
    NoTouchElementException
    “用字母代替数字”@谢谢你,到目前为止,我是一个初级程序员,正在尽力做到最好。
    抛出新的NullPointerException(“未找到用户”)
    将停止程序以读取所有方法代码,但如果没有必要,我将删除它。我还没有看到
    NoTouchElementException
    ,非常感谢您的提醒。@Andy Turner这是怎么回事,我不知道。因为对象为空,如果我没有捕捉到
    NullPointerExpection
    ,程序就会崩溃。你有什么例子能让我走上正确的道路吗。谢谢,非常感谢!。我将为该类编写代码并更新问题。如何传递异常,同样,需要在LoginException中再次尝试/捕获它。?例如,
    public LoginException(异常e){try{if(e.getClass()==NoSuchElementException.class){JOptionPane.showMessageDialog(null,“未找到用户”);}}}catch(NoSuchElementException ex){throw ex;}
    @JuanSebastianOsorio否。当您遇到无法继续的
    异常
    情况(即交易失败)时,您会像创建任何其他对象一样创建新的LoginException,然后将其抛出。然后它跳转到ActionListener,在那里您可以执行
    JOptionPane.showMessageDialog(null,例如getMessage())在catch块中类似这样的内容?但我必须知道例外情况是不是被抛出了?来配置消息。谢谢你抽出时间。非常感谢您的帮助。@JuanSebastianOsorio是的,就像他们在链接中所做的那样。至于“但我必须知道哪种例外……”您在上面描述了错误案例。如果找不到用户,在这种情况下,您甚至不会有异常,但您应该抛出带有消息的LoginException:“找不到用户”。如果有SQL异常:“数据库有问题…”如果有数字,同样:“请仅使用用户ID字符”非常感谢!。我将为该类编写代码并更新问题。如何传递异常,同样,需要在LoginException中再次尝试/捕获它。?例如<
    
    public class LoginException extends Exception{
      public LoginException(Exception cause, String message) {
        ..
      }
    }