2015-02-24 4 views
-1

У меня есть класс CheckPrograminstallation (который является частью плагина eclipse) с проверкой метода, которая проверяет, установлена ​​ли программа. Он возвращает true при установке и false в противном случае.разные результаты для того же метода call

public class CheckPrograminstallation{ 
    public static boolean check(String programname, String OsName) 
      throws Exception { 

     // Get installation path of programname 
     String foundpath = ""; 
     String dirName = ""; 
     String line; 
     String programpath = null; 
     Process process = null; 
     boolean IsInstalled = false; 

     if (OsName.equals("Windows")) { 
      try { 
       // get Windows Directory first 
       process = Runtime.getRuntime().exec("cmd /c echo %windir%"); 
       BufferedReader reader = new BufferedReader(
         new InputStreamReader(process.getInputStream())); 
       // read from stream 
       if ((line = reader.readLine()) != null) { 
        foundpath = line.toString(); 

        // cut off "\Windows" from the found path 
        int last = foundpath.lastIndexOf("\\"); 
        dirName = foundpath.subSequence(0, last).toString(); 
        process = null; 

        // get program installation path 
        process = Runtime.getRuntime().exec(
          "cmd /c where /R " + dirName + " " + programname); 

        reader = new BufferedReader(new InputStreamReader(
          process.getInputStream())); 
        if ((line = reader.readLine()) != null) { 
         programpath = line.toString(); 
         System.out.println(programpath); 
         IsInstalled = true; 

        } 
       } 
      } catch (Exception e) { 
       DO SOMETHING); 
      } 
     } 

Когда я вызываю метод из тестового класса, он работает. Но когда я называю тот же метод, при запуске плагина:

...boolean isInstalledPscp; 
    boolean IsWindows; 
... 
     if (IsWindows == true) { 
      // for Windows: check if pscp is installed 
      isInstalledPscp = CheckIfInstalled.check("pscp", "Windows"); 
     if (isInstalledPscp == false) { 
      do something } 
     } 

... она всегда возвращает ложь. Как это может быть?

Это привело меня в сумасшествие на целый день. Использование .equals для сравнения String и по-прежнему получать false как результат. Итак, это не проблема сравнения строк ИМХО.

ответ

0

Изменить сравнение строк из:

if (OsName == "Windows") { 

To:

if (OsName.equals("Windows")) { 

Так как ваш, если не удастся, она никогда не переходит в если и, следовательно, он возвращает ваше ложное.

+0

исправлено это, все еще возвращает false – Sandra

+0

Тогда может быть несколько проблем. 1. код не входит в 'if (IsWindows == true) {' и, следовательно, вы приземляетесь со значением по умолчанию 2. ваш код не переходит в 'if ((line = reader.readLine())! = Null) {' (обратите внимание на его дважды) и чтобы установить переменную в true, она должна вводиться в оба цикла. – SMA

0

Вы сравниваете строки, используя метод equals(), а не логический оператор равен ==

Я также рекомендую следовать соглашению об именах Java и использовать имена переменных, начинающиеся с букв нижнего регистра, такие как osName вместо OsName.

+0

исправил это, все еще возвращает false – Sandra

0

Распечатайте, какие пути, которые возвращаются внутри вашего кода (если есть), я подозреваю, что изнутри плагина параметры времени выполнения отличаются.

Также возможно System.getEnv System.getProperties - это лучший способ найти каталог windows, чем запуск нового процесса.

+0

проблема в том, что из-за ошибки я не могу использовать Self Hosting в Eclipse и без самостоятельного хостинга в режиме отладки, я не знаю, как показать консольные выходы. Я в принципе не вижу результатов. Я не могу System, getproperties, потому что я определяю ОС из информации онтологии – Sandra

+0

Вы можете отлаживать файл. Вы не используете онтологии, которые вы вызываете «эхо», а затем «где» из командной строки. – Zielu

+0

определение типа Os из онтологии, используя «где», чтобы узнать имя диска. – Sandra