2016-08-19 119 views
3

調用變量我有基於以下代碼的問題:從主要方法

public class LoginCaptchaChrome { 

    public static void main(String[] args) throws IOException, InterruptedException{ 
     String tc = args[0]; 
     String address = args[1]; 
     String test_data = args[2]; 
     String test_result = args[3]; 

     System.setProperty("webdriver.chrome.driver", "C:\\Users\\Lam Chio Meng\\Desktop\\work\\chromedriver_win32\\chromedriver.exe");  
     //Do other stuff 
     } 

    //runTest is called from a different class 
    public static void runTest(String string0, String string, String string1) throws InterruptedException, IOException{ 
     WebDriver login = new ChromeDriver();  
     System.out.println(login); 

     login.get(address); 
     //Do other things 
    } 
} 

我從通過命令提示符下執行過程中傳遞的參數獲得值tc,address,test_datatest_result。現在,我想將address的值傳遞給位於runTest方法中的login.get(address)

我現在無法這樣做,因爲我知道要發生這種情況,變量address必須在主方法之外聲明。我不能在主方法外部聲明address變量,因爲它從命令提示符處接收參數。請記住runTest方法已被分配爲接受來自不同類的另一個方法的值。希望能向大家提供如何在runTest方法中將主要方法中的address值傳遞給address變量的建議。

+1

「我不能聲明地址變量的主要方法外,因爲它是從命令提示接收arguements。」, - 如何分配'main'方法中的變量限制它不被聲明爲字段? – user3707125

+0

嗨用戶,感謝您的反饋。我相信這是因爲如果我在主方法之外聲明它們,我將無法接受從命令提示符執行期間傳遞的爭論。這有助於澄清?如果我在這方面有所欠缺,我很抱歉。基本上,我會將這段代碼導出到jar文件中,並且將通過java -jar c:\ Test \ LoginCaptchaChrome test1 www.test.com c:\ testdata \ data.xlsx c:\ testresult \ result.xlsx – lamCM

+0

「如果我在主要方法之外聲明它們,我將無法接受從命令提示符執行期間傳遞的爭論。「 - 爲什麼? – user3707125

回答

0

您可以在class LoginCaptchaChrome中聲明一個字段。聲明一個可以在主要方法中訪問的靜態字段。

記住非靜態字段需要一個要訪問的類(一個對象)的實例,靜態字段不需要實例並且可以通過靜態上下文訪問。

現在一些代碼示例:

public class LoginCaptchaChrome { 

    public static Optional<String> addressOptional = Optional.empty 

    public static void main(String[] args) throws IOException, InterruptedException{ 
     String tc = args[0]; 
     String address = args[1]; 
     String test_data = args[2]; 
     String test_result = args[3]; 


     //using Optional since it will simply handling value not present cases 
     addressOptional = Optional.of(args[4]); 

     System.setProperty("webdriver.chrome.driver", "C:\\Users\\Lam Chio Meng\\Desktop\\work\\chromedriver_win32\\chromedriver.exe");  
     //Do other stuff 
     } 

    //runTest is called from a different class 
    public static void runTest(String string0, String string, String string1) throws InterruptedException, IOException{ 
     WebDriver login = new ChromeDriver();  
     System.out.println(login); 
     //Using this you throw an error when no address is supplied via cmd , 
     //if address is supplied then you will get it here 
     login.get(addressOptional.orElseThrow(()->new NoSuchElement("address is not provided"))) 


     //Do other things 
    } 
} 

閱讀有關使用Java 8可選,如果你不熟悉,它可以幫助你避免空,採取更加實用的方法。

Optional documentation

+1

爲什麼(錯誤)使用'Optional'如果'address'實際上是強制性的? - 也可以使用'if'或者使用斷言手動拋出異常。 - 另外,使用'Optional'的檢查已經失敗,如果它被設置爲空字符串''「'。 –

+0

@MarkusMitterauer:很好,馬克,我沒有意識到它會失敗,因爲我認爲你的方法使用if和檢查條件是一個更好的主意。我在回答中的主要目標是獲得使用靜態字段的想法。使用可選項顯然是可選項(無雙關意) – faizan

+0

Downvoter謹慎解釋? – faizan

0

爲了保持簡單:LoginCaptchaChrome創建靜態字段:

public class LoginCaptchaChrome { 

    static String address = ""; // <-- private if only set from main, otherwise public 

    public static void main(String[] args) throws IOException, InterruptedException{ 
     String tc = args[0]; 
     address = args[1]; 
     String test_data = args[2]; 
     String test_result = args[3]; 

     System.setProperty("webdriver.chrome.driver", "C:\\Users\\Lam Chio Meng\\Desktop\\work\\chromedriver_win32\\chromedriver.exe");  
     //Do other stuff 
    } 

    //runTest is called from a different class 
    public static void runTest(String string0, String string, String string1) throws InterruptedException, IOException{ 
     WebDriver login = new ChromeDriver();  
     System.out.println(login); 

     login.get(address); 
     //Do other things 
    } 
} 

的另一種選擇是在main()

System.setProperty("LoginCaptchaChrome.address", address); 

或命令的使用系統屬性行:

-DLoginCaptchaChrome.address=<address>` 

和在登錄用它

login.get(System.getProperty("LoginCaptchaChrome.address")); 

HTH