2012-06-03 122 views
0

以下是代碼。If/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

...它仍然承認「參數1參數2參數3」作爲一個參數。注:我的系統的類路徑設置爲C:\JavaSource,所以-cp Invoke;HelloJava4使得搜索Invoke.class和HelloJava4.class

的調用和HelloJava4目錄

如果我做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處理事情就好了,包括塊。當你認爲它沒有這樣做時,仔細查看* your *代碼中的錯誤,或者*瞭解Java是如何工作的。 –

+0

我不確定我相信你;我不能欺騙這個。你確定你重新編譯了/ etc? –

+0

您是否嘗試過打印參數的內容? –

回答

4

在您未經編輯的代碼中,此行發生異常。

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

它甚至沒有達到參數數目的if/else條件。

+0

Doh。這應該是顯而易見的。 t,因爲param1不作爲HelloJava4中的方法存在。 :(但是,如果我使用'java -cp Invoke; HelloJava4調用HelloJava4 main'來執行它,它甚至不會工作,所以你對這個問題是正確的,但我仍然難以理解爲什麼它贏了即使當我指定一種確實存在的方法時也是行不通的。 – TimFoolery

+0

我試過了,我無法重現這一點,我能夠正常工作。 C:\用戶\ KJP>鍵入Invoke.java C:尚不支持\用戶\ KJP>的java調用字符串1個2 3 附加參數。尚不支持\用戶\ KJP>的java調用字符串1 2 附加參數: ℃。 C:\用戶\ KJP>的java調用字符串1個 結果:2 – kjp

+0

呸。只是想通了。 '的java的調用java.lang.System中currentTimeMillis'書中的例子可以作爲很好。問題是,HelloJava4的主要方法也有參數(雖然我不能告訴你爲什麼,因爲它不使用它們),而我在尋找'公共靜態無效的主要()',而不是'公共靜態無效的主要(String [] args)'。嘆。我是個假人。感謝您指點我正確的方向。^_^ – TimFoolery

2

java -cp Invoke;HelloJava4 Invoke HelloJava4 param1 param2 param3

這是不對的。我不知道什麼操作系統,也不知道你用什麼shell來執行該行。

我不認爲:

-cp Invoke;HelloJava4

是正確的。 (我之所以這麼說,是因爲您遇到了無法再現的問題。)

要驗證,請執行您給我們的代碼片段,而不使用任何-cp或-classpath。

編輯: 如果我們假設-cp參數是正確的。 這意味着jvm以類路徑中的目錄Invoke和HelloJava4啓動(-cp/-classpath覆蓋指定類路徑的環境變量),jvm將在Invoke目錄的Invoke目錄和HelloJava4目錄中查找Invoke類。這意味着你可能正在執行另一個課程,而不是你認爲的自己。

您的示例代碼位於默認包中。 只要到所在目錄的資源文件是與執行:

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

(點說,當前目錄是在classpath ...)

,你會看到一個不同的結果。