2012-06-03 2 views
0

Вот код.Если/else обрабатывается неправильно? (Java)

import java.lang.reflect.*; 

class Invoke { 
    public static void main(String[] args) { 
     int ret; 

     if (args.length<2) { 
      System.out.println("Usage: Invoke <class> <method>"); 
      return; 
     } 

     if (args.length == 2) { 
       ret = 2 
     } else { 
      System.out.println("Additional parameters not yet supported."); 
      return; 
     } 

     System.out.println("Results: " + ret); 
    } 
} 

Проблема заключается в том, даже если я запускаю программу что-то вроде ...

java -cp Invoke;HelloJava4 Invoke HelloJava4 param1 param2 param3

... она по-прежнему признает "param1 param2 param3" в качестве одного из аргументов. Примечание: Путь к классам моей системы установлен в C:\JavaSource, так -cp Invoke;HelloJava4 делает поиск в каталогах Invoke и HelloJava4 для Invoke.class и HelloJava4.class

Если я System.out.println(args.length);, он будет выводить правильное число аргументов дано, но когда я проверьте его со следующим оператором if, он запускает блок кода if, а не блок кода else.

if (args.length == 2) { 
    ret = 2 
} else { 
    System.out.println("Additional parameters not supported yet."); 
    return; 
} 

Что дает? : Путать:

Вот неотредактированным код, в полном объеме:

import java.lang.reflect.*; 

class Invoke { 
    public static void main(String[] args) { 
     Object ret; 

     for (String arg : args) 
      System.out.println(arg); 

     System.out.println("Count: " + args.length + " \n"); 

     if (args.length<2) { 
      System.out.println("Usage: Invoke <class> <method>"); 
      return; 
     } 

     try { 
      Class theClass = Class.forName(args[0]); 

      Method theMethod = theClass.getMethod(args[1]); 
      if (args.length == 2) { 
       System.out.println("Invoking method " + args[1] + " within class " + args[0]); 
       ret = theMethod.invoke(null); 
      } else { 
       // pass parameters to .invoke() if more than two args are given 
       // for now, just exit... 

       System.out.println("Parameter passing not yet supported."); 
       return; 
      } 

      System.out.println("Invoked static method: " + args[1] 
      + " of class: " + args[0] 
      + " with no args\nResults: " + ret); 
     } catch (ClassNotFoundException e) { 
      System.out.println("Class (" + args[0] + ") not found."); 
     } catch (NoSuchMethodException e2) { 
      System.out.println("Class (" + args[0] + ") found, but method does not exist."); 
     } catch (IllegalAccessException e3) {  
      System.out.println("Class (" + args[0] + ") and method found, but method is not accessible."); 
     } catch (InvocationTargetException e4) { 
      System.out.println("Method threw exception: " + e4.getTargetException()); 
     } 
    } 
} 

А вот точные результаты дает:

C:\JavaSource>cd invoke 

C:\JavaSource>javac invoke.java 
Note: invoke.java uses unchecked or unsafe operations. 
Note: Recompile with -Xlint:unchecked for details. 

C:\JavaSource>cd .. 

C:\JavaSource>java -cp Invoke;HelloJava4 Invoke HelloJava4 param1 param2 p 
aram3 
HelloJava4 
param1 
param2 
param3 
Count: 4 

Class (HelloJava4) found, but method does not exist. 
+6

Серьезно. Ошибка Java? Я думаю, вы обнаружите, что Java обрабатывает все просто, включая блоки.Когда вы думаете, что это не так, обратите внимание на ошибку в * вашем * коде или в * вашем * понимании Java, как работает Java. –

+0

Я не уверен, что я тебе верю; Я не могу обмануть это. Вы уверены, что вы перекомпилировали/etc? –

+0

Вы пробовали распечатать содержимое арсов? –

ответ

4

В своем неотредактированном коде исключение выбрано из этой строки.

Method theMethod = theClass.getMethod(args[1]); 

Он даже не достигает условия if/else для количества аргументов.

+0

Doh. Это должно было быть очевидно. Плохой выбор параметров на моем уровне t, поскольку param1 не существует как метод в HelloJava4. :(Тем не менее, он даже не работает, если я выполняю его с помощью java -cp Invoke; HelloJava4 Invoke HelloJava4 main', поэтому вы правы в том, что это проблема с этой линией, но я все равно не могу понять, почему она выиграла Я работаю, даже когда я указываю метод, который действительно существует. – TimFoolery

+0

Я пробовал это, и я не могу воспроизвести это. Я могу заставить его работать правильно. C: \ Users \ kjp> type Invoke.java C: \ Users \ kjp> java Invoke String 1 2 3 Дополнительные параметры пока не поддерживаются. C: \ Users \ kjp> java Invoke String 1 2 Дополнительные параметры еще не поддерживаются. C: \ Users \ kjp> java Invoke String 1 Результаты: 2 – kjp

+0

Bah. Просто понял это. Пример книги 'java Invoke java.lang.System currentTimeMillis' также работает. Проблема в том, что у главного метода HelloJava4 также есть параметры (хотя я не мог сказать вам, почему, поскольку он их не использует), и я ищу 'public static void main()' вместо 'public static void main (String [] args) '. Вздох. Я манекен. Спасибо, что указал мне в правильном направлении.^_^ – TimFoolery

2

java -cp Invoke;HelloJava4 Invoke HelloJava4 param1 param2 param3

Это не правильно. Я не знаю, какую ОС и какую оболочку вы используете для выполнения этой строки.

Я не думаю, что:

-cp Invoke;HelloJava4

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

Чтобы проверить, выполните фрагмент, который вы предоставили нам, без какого-либо -cp или -classpath.

Редактировать: Если мы предположим, что аргумент -cp правильный. Значение jvm начинается с каталогов Invoke и HelloJava4 в пути к классам (-cp/-classpath переопределяет переменную окружения, определяющую путь к классам) jvm будет выглядеть в каталогах Invoke и HelloJava4 для класса Invoke. Это означает, что вы, вероятно, выполняете другой класс, чем вы думаете.

Код примера в пакете по умолчанию. Просто перейдите в каталог, где находится исходный файл и выполнить:

javac Invoke.java 
java -cp . Invoke param1 param2 param3 [...] 

(точка говорит текущий каталог находится в пути к классам ...)

И вы должны увидеть другой результат.