2017-04-14 8 views
2

개인 프로젝트에서 '단순화'버전의 코드를 작성하는 데 문제가 있습니다. Arraylist에 데이터를 할당하고 있는데 indexOf ("")를 사용하여 인덱스에 액세스하려고합니다. 2 년 동안 Java를 사용하지 않았으므로 다시 돌아가는 데 문제가 있습니다.Arraylist Java, Scope 문제 수정

import java.util.ArrayList; 

public class tre 
{ 
    private ArrayList<String> open; 

    public tre() 
    { 
     open = new ArrayList<String>(); 

     String s = "chaine1,chaine2, chaine a, chaine b, chaine c"; 
     String str[] = s.split(","); 

     for (int i = 0; i < str.length; i++) { 
      open.add(str[i]); 
     } 
    } 

    public void nouvel() 
    { 
     System.out.println(open.get(0)); 
     int test = open.indexOf(" chaine b"); 
    } 
} 

내가 뭘하려고 오전입니다 : 다음의 1 호 타 클래스 내 tre.java 여기

import plo.tre; 

public class Plo 
{ 
    public static void main(String[] args) 
    { 
     tre test = new tre(); 

     // my problem 
     StockDownloader.nouvel(); 
    } 
} 

을 그리고 다음은

주이며, Plo.java 전화 main 메서드 누벨, 2- 같은 클래스에서 작성된 Arraylist에 액세스 할 수 있지만 다른 방법으로 채 웁니다.

나는 어리석은 것으로 알고 있지만 해결책을 찾지 못했습니다.

도움을 주셔서 대단히 감사합니다. 아래 그림과 같이 대신 StockDownloader.nouvel();

답변

2

을 시도, 당신은 tre 클래스의 참조를 사용합니다 (즉, test)를 nouvel() 메소드를 호출합니다 :

test.nouvel(); 

Could you explain me what was the problem?

클래스 이름 StockDownloader (정의 된 위치가 확실하지 않음)을 사용하여 nouvel() 메서드를 호출합니다. 클래스 이름은 클래스의 static 메서드/멤버를 호출하는 데만 사용할 수 있습니다. 비 static 메서드를 호출하려면 객체 참조 (예 : test은 새로 만든 tre 클래스 객체에 대한 객체 참조라고 함)를 사용해야합니다.

따라서 문제는 개체 참조를 사용하여 수행 중이 지 않은 Tre 클래스의 클래스 멤버를 호출해야한다는 것입니다. 따라서 nouvel() 메서드를 호출하려면 test (객체의 참조)을 사용하십시오.


또한, 나는 강하게 당신이 코드를 읽을 수 있도록 자바 명명 표준 즉, 클래스 이름은 대문자로 시작해야 다음 Tre (또는 훨씬 더 의미)에 클래스 이름을 변경하는 것이 좋습니다.

또 하나의 포인트는 인스턴스 변수를 초기화 클래스 생성자가 의미하는 것입니다 당신이 그것을 리팩토링 할 수 있도록 아래와 같은 코드가 뒤범벅이되어

트레 클래스 :

public class Tre { 
    private ArrayList<String> open; 

    public Tre() { 
     open = new ArrayList<String>();//just initialize ArrayList 
    } 

    public void loadData() {//add a new method to load ArrayList 
     String s = "chaine1,chaine2, chaine a, chaine b, chaine c"; 
     String str[] = s.split(","); 

     for (int i = 0; i < str.length; i++) { 
      open.add(str[i]); 
     } 
    } 

    public void nouvel() { 
     System.out.println(open.get(0)); 
     int test = open.indexOf(" chaine b"); 
    } 
} 

을 Plo 클래스 :

public class Plo { 
    public static void main(String[] args) { 
     Tre test = new Tre();//create object for Tre with ref variable as test 
     test.loadData();//call loadData() method using test ref. 
     test.nouvel();//call nouvel() method using test ref. 
    } 
} 
+0

안녕하세요, 귀하의 답변을 주셔서 감사합니다, 이것은 실제로 그것이 효과가 있습니다. 문제가 무엇인지 설명해 주시겠습니까? 네 말이 맞아, 나는 네이밍 표준을 사용하지 않는 것을 부끄럽다. 그리고 나는 그들을 안다 ... 다음 번에 나는 그것을 더 깨끗하게 게시 할 것이다. – ViPro

+0

위의 설명을 추가했습니다. – developer

+0

알았습니다. 작성한 코드로 작업 할 것입니다. 나는 정말로 나의 자바 기초를 최신으로 얻을 필요가있다. 해결책을 설명 해주셔서 감사합니다. 정말 고맙습니다. – ViPro

0

, 당신의 main() 방법 tre.nouvel();

+0

안녕하세요, 빠른 답변, 이렇게하면 다음과 같은 오류가 발생합니다. "오류 : 정적이 아닌 메서드 인 nouvel()은 정적 컨텍스트 tre.nouvel();에서 참조 할 수 없습니다." – ViPro

+0

그래, 나는 조금 빨랐다. 위에서 언급 한 것처럼 test.nouvel()이 올바른 일이었을 것입니다.:) – faffaffaff