1 Востаннє редагувалося Пам'ять не може бути READ (28.06.2013 18:50:01)

Тема: Чому не справджується умова ?

Є така проблемка, не справджується умова при тому, що два значення рівні.
Є ось така от умова:

if(sha1Hash == "53c1f6ee200f106be72db3ecd086b4de8e1e66bd")
{
true
}
else
{
false
}

А ось повний код:

public void login(String userName, String password) {
    try {
      String md5Hash = LauncherFrame.getChecksum(Util.getWorkingDirectory() + File.separator + "bin" + File.separator + "minecraft.jar", "MD5");
      String sha1Hash = LauncherFrame.getChecksum(Util.getWorkingDirectory() + File.separator + "bin" + File.separator + "minecraft.jar", "SHA1");  
      
      if(sha1Hash == "53c1f6ee200f106be72db3ecd086b4de8e1e66bd")
      {
      String parameters = "user=" + URLEncoder.encode(userName, "UTF-8") + "&password=" + URLEncoder.encode(password, "UTF-8") + "&version=" + 1 + "&hash=" + URLEncoder.encode(md5Hash, "UTF-8");
      String result = Util.excutePost("http://секретно/bukkit_server/xAuth.php", parameters);

      if (result == null) {
        showError("Неможливо підключитися до сервера");
        loginForm.setNoNetwork();
        return;
      }
      if (!result.contains(":")) {
        if (result.trim().equals("Bad login")) {
          showError("Невірний логін або пароль");
        } else if (result.trim().equals("Old version")) {
          loginForm.setOutdated();
          showError("Потрібно оновити лаунчер");
        } else {
          showError(result);
        }
        loginForm.setNoNetwork();
        return;
      }
      String[] values = result.split(":");

      launcher = new Launcher();
      launcher.customParameters.putAll(customParameters);
      launcher.customParameters.put("userName", values[2].trim());
      launcher.customParameters.put("latestVersion", values[0].trim());
      launcher.customParameters.put("downloadTicket", values[1].trim());
      launcher.customParameters.put("sessionId", values[3].trim());
      launcher.init();

      removeAll();
      add(launcher, "Center");
      validate();
      launcher.start();
      loginForm.loginOk();
      loginForm = null;
      setTitle("Minecraft");
      }
      else
      {
       //loginForm.setOutdated();
       showError(sha1Hash);
      }
    } catch (Exception e) {
      e.printStackTrace();
      showError(e.toString());
      loginForm.setNoNetwork();
    }
  }

Змінна sha1Hash отримує таке саме значення, як вписано при порівнянні, але при тому умова не справджується.
В чому може бути причина ?
P.S: але якщо змінній sha1Hash зразу присвоїти значення

53c1f6ee200f106be72db3ecd086b4de8e1e66bd

, а не присвоювати результат

LauncherFrame.getChecksum(Util.getWorkingDirectory() + File.separator + "bin" + File.separator + "minecraft.jar", "SHA1")

то умова справджується.

2

Re: Чому не справджується умова ?

Приховані символи не попали до результату (всякі \r, \n, etc)?
Посимвольно зневаджували?

3 Востаннє редагувалося koala (28.06.2013 19:18:32)

Re: Чому не справджується умова ?

Hanter написав:

Змінна sha1Hash отримує таке саме значення, як вписано при порівнянні, але при тому умова не справджується.
В чому може бути причина ?
P.S: але якщо змінній sha1Hash зразу присвоїти значення

53c1f6ee200f106be72db3ecd086b4de8e1e66bd

, а не присвоювати результат

LauncherFrame.getChecksum(Util.getWorkingDirectory() + File.separator + "bin" + File.separator + "minecraft.jar", "SHA1")

то умова справджується.

Попрацюю К.О.: значить,

LauncherFrame.getChecksum(Util.getWorkingDirectory() + File.separator + "bin" + File.separator + "minecraft.jar", "SHA1")

повертає не 53c1f6ee200f106be72db3ecd086b4de8e1e66bd.

До речі, якщо бути не К.О., то в "53c1f6ee200f106be72db3ecd086b4de8e1e66bd" непарна кількість 16-кових цифр...

І взагалі - не використовуйте магічні константи!

4 Востаннє редагувалося Replace (28.06.2013 20:02:56)

Re: Чому не справджується умова ?

String в java не скалярний тип, а грубо кажучи клас для якого лише одна операція перевизначена – це +.
== використовується для порівняння адрес об'єктів.
Для порівняння значень використовується метод equals(). Детальніше в документації.

Тобто, потрібно код переписати наступним чином:

if(sha1Hash.equals("53c1f6ee200f106be72db3ecd086b4de8e1e66bd")) {
//true
} else {
//false
}

P.S. подивився лише 1-й код.

Re: Чому не справджується умова ?

Replace написав:

String в java не скалярний тип, а грубо кажучи клас для якого лише одна операція перевизначена – це +.
== використовується для порівняння адрес об'єктів.
Для порівняння значень використовується метод equals(). Детальніше в документації.

Тобто, потрібно код переписати наступним чином:

if(sha1Hash.equals("53c1f6ee200f106be72db3ecd086b4de8e1e66bd")) {
//true
} else {
//false
}

P.S. подивився лише 1-й код.

Дякую, допомогло.

6

Re: Чому не справджується умова ?

Упс, це ж треба... Помилився, ще й двічі... В якості вибачення даю цікавеньку задачу про цю гидотну кавуJava.

Подякували: Replace1

7

Re: Чому не справджується умова ?

Якраз задача на цю тему - http://replace.org.ua/topic/1469/