2012-04-23 5 views
0

나는이 "true"로 출력이자바 정적 메소드

public class StockCodes 
{ 

    public static boolean loaded = false; 
    public static long lastUpdate = 0; 
    private static long freq = 1000 * 60 * 60 * 24; 
    public static HashMap<String, Stock> stockMap = new HashMap<String, Stock>(); 

    public static ArrayList<Stock> getCodes() 
    { 
     long now = System.currentTimeMillis(); 
     if ((StockCodes.loaded) && ((now - StockCodes.lastUpdate) < freq)) 
     { 
      System.out.println(StockCodes.loaded); 
      return stockList; 

     } 
    else 
     { 
      HttpFetcher fetcher = new HttpFetcher(); 

     .... 

      log.info("Load " + stockList.size() + " Stocks"); 
      StockCodes.loaded = true; 
      StockCodes.lastUpdate = now; 
      return stockList; 
     } 
    } 


    public static void main(String[] args) 
    { 
     StockCodes.getCodes(); 
    } 
} 

같은 클래스가 있습니다. 우리에게 증권 코드가 알려졌다. 하지만 Java 응용 프로그램을 디버깅 할 때 다른 응용 프로그램으로 이동합니다. 왜 이런 방식으로 실행되는지 이해하지 못합니다. 특히 애플리케이션을 처음 실행할 때 "true"를 출력하는 이유는 무엇입니까? 다른 사람이 나에게 도움을 줄 수 있겠 니? ~

+0

"'.... '"의 내용은 무엇입니까? 아마도'StockCodes.getCodes()'호출일까요? –

+0

두 경우 모두 - 뭐하고 있니? 우리가 본 것을 보면,이 프로그램은 절대로 출력해서는 안되지만 main 메소드를 실행하고 java 어플리케이션을 실행할 때 디버깅을하는 것처럼 보이는 것입니다. 종료하기 전에 StockCodes = true로 설정합니다. – dfb

+0

부울 변수를 사용하면 어떤 이점이 보이지 않습니다. 대신에 init 메소드를 사용할 수 있습니다 (부울 변수를 참 상태로 설정하면 공명은 영원히 참입니다) –

답변

0

위에서 주어진 코드를 사용하면 기본적으로 컨트롤이 항상 else 블록에 들어가서 아무 것도 인쇄하지 않아야합니다. 그것을 확인할 수 있습니다.

getCodes() 방법으로 전화를 거는 장소가 더 많지 않은 경우에는 다릅니다. 이 말을 듣고 getCodes()으로 전화를 걸 수있는 다른 곳이 없는지 확인하십시오. 즉, 한 번 호출 한 시간은 main()

0

getCodes() 함수는 함수가 두 번 이상 실행되면 결과를 캐시합니다. 첫 번째 getCodes()는 "true"로 인쇄 할 수 있지만 모든 후속 호출 명령 줄

public static void main(String[] args) 
{ 
    StockCodes.getCodes(); 
} 

STDOUT이해야 출력 아무것도에서 것이다

를 실행합니다.

0

if입니다. 이런 종류의 실수 중 하나가있을 때 나는 오래된 패션 루트로 간다. 난 당신의 코드가 어디로 가는지 추적 코드의 해당 섹션에

System.out.println 

일련의 문장을 넣을 때하지 디버그 모드입니다. 그것은 clunky하지만 작동합니다.

0

내가 코드를 실행하면 디버그 모드 또는 일반 모드로 실행되는지 여부는 else이됩니다.

코드 줄을 잃어버린 것 같습니다. 있었습니까 System.out.println (StockCodes.loaded); else 지점의 도 있습니까? 만약 당신이 그랬다면 당신은 당신의 라인 아래에 StockCodes.loaded = true; 아래에 위치 시켰을 것입니다. 그러면 그것은 true을 인쇄 할 것입니다.

System.out.println("In the if branch");과 같은 자세한 디버깅을 사용하는 것이 좋습니다. 그 외의 지점에서는 System.out.println("In the else branch");과 같은 줄을 출력합니다. 출력이 너무 적어서 자신을 속이는 것 같습니다.