3

我正在为 SmartFox 服务器扩展创建一个 Java 类。它正在尝试访问 MySQL 数据库。

我收到一个Unreachable Code在线调用的错误session.setProperty("DatabaseID", dbId);

package sfs2x.extension.test.dblogin;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.smartfoxserver.bitswarm.sessions.ISession;
import com.smartfoxserver.v2.core.ISFSEvent;
import com.smartfoxserver.v2.core.SFSEventParam;
import com.smartfoxserver.v2.db.IDBManager;
import com.smartfoxserver.v2.exceptions.SFSErrorCode;
import com.smartfoxserver.v2.exceptions.SFSErrorData;
import com.smartfoxserver.v2.exceptions.SFSException;
import com.smartfoxserver.v2.exceptions.SFSLoginException;
import com.smartfoxserver.v2.extensions.BaseServerEventHandler;

public class LoginEventHandler extends BaseServerEventHandler 
{
    @Override
    public void handleServerEvent(ISFSEvent e) throws SFSException 
    {
        String email = (String)e.getParameter(SFSEventParam.LOGIN_NAME);
        String pass = (String)e.getParameter(SFSEventParam.LOGIN_PASSWORD);
        ISession session = (ISession)e.getParameter(SFSEventParam.SESSION);

        IDBManager dbManager = getParentExtension().getParentZone().getDBManager();
        Connection connection = null;

        try
        {
            connection = dbManager.getConnection();

            PreparedStatement stmt = connection.prepareStatement("SELECT * FROM users WHERE email=?");
            stmt.setString(1, email);

            ResultSet res = stmt.executeQuery();

            if(!res.first())
            {
                SFSErrorData errData = new SFSErrorData(SFSErrorCode.LOGIN_BAD_USERNAME);
                errData.addParameter(email);

                throw new SFSLoginException("Bad user name: "+ email, errData);
            }

            String dbPword = res.getString("password");
            int dbId = res.getInt("id");

            if(!getApi().checkSecurePassword(session, dbPword, pass));
            {
                SFSErrorData errorData = new SFSErrorData(SFSErrorCode.LOGIN_BAD_PASSWORD);
                errorData.addParameter(email);

                throw new SFSLoginException("Bad password for user: "+ email, errorData);
            }

            session.setProperty("DatabaseID", dbId);
           //UNREACHABLE CODE
           //IF I COMMENT THIS OUT, THERE IS NO UNREACHABLE CODE ERROR

        }

        catch(SQLException eve)
        {
            SFSErrorData erroData = new SFSErrorData(SFSErrorCode.GENERIC_ERROR);
            erroData.addParameter("SQL Error: " + eve.getMessage());

            throw new SFSLoginException("A SQL Error occurred: " + eve.getMessage(), erroData);
        }

        finally
        {
            try 
            {
                connection.close();
            }
            catch (SQLException e1) 
            {

            }
        }
    }

}
4

3 回答 3

7

您的第二个 if 语句以 that 终止;是一个有效的语句。并且您在下一个块中抛出异常,这就是错误的原因。

if(!getApi().checkSecurePassword(session, dbPword, pass));

上面的 if 语句以分号终止,这是一个有效的语句,并且 if 语句将对其进行操作,您的代码的另一部分正在执行,而与 if 语句无关,并且在最后抛出异常。

{
    SFSErrorData errorData = new SFSErrorData(SFSErrorCode.LOGIN_BAD_PASSWORD);
    errorData.addParameter(email);

    throw new SFSLoginException("Bad password for user: "+ email, errorData);
}

这就是您收到错误的原因,因为您的线路session.setProperty("DatabaseID", dbId);永远无法到达。

于 2013-02-22T13:00:17.530 回答
3

;在上一个代码块之前有一个伪造的:

if(!getApi().checkSecurePassword(session, dbPword, pass));
                                                      // ^
                                                      // |
                                                      // +---- remove this ';'
{
   ...
   throw new SFSLoginException("Bad password for user: "+ email, errorData);
}

session.setProperty("DatabaseID", dbId);

因此throw总是执行,因此代码永远不会到达session.setProperty().

于 2013-02-22T13:00:23.530 回答
0

因为;在 second 之后有一个不想要的if,所以下面的{}总是会被执行。这意味着SFSLoginException始终抛出 a 并且执行将跳转到catch.

这将导致该setProperty方法永远不会被调用。

您需要从代码中的以下语句中删除分号:

if(!getApi().checkSecurePassword(session, dbPword, pass));

于 2013-02-22T13:04:35.950 回答