2012-12-10 5 views
0

창에서 상자 색상을 변경할 수있는 간단한 색상 조작 프로그램을 만들려고합니다. 나는 그 값들을 포함하도록 특별히 설정 한 클래스로 파일로부터 그들을 읽음으로써 미리 설정된 색들을 사용하고 있습니다. 모든 사전 설정 값을 포함하도록 배열을 사용하고 배열의 개별 요소에 액세스하려고하면 nullpointer 예외가 계속 발생합니다. 이것은 자바를 처음 사용하려고 시도한 것이므로 내가 실수를 저질렀다고 생각합니다. 내가 첫 번째 요소의 이름에 액세스하려고 할 때이 문제가 발생 해결하는 것입니다 방법, 그래서java의 다른 클래스에있는 정수에 액세스 할 때 null 포인터가 생깁니다.

public class colors 
{ 
public int r, g, b; 
public String name; 
public colors() 
{ 
    r = 0; 
    g = 0; 
    b = 0; 
    name = "bob"; 
} 

} 

:

package color.sampler; 
import java.io.*; 
import javax.swing.*; 
import javax.swing.event.*; 


public class ColorSampler extends JFrame 
{ 
protected ColorFrame sampler; 
public JList colorList; 
protected colors [] listOfColors; 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) throws IOException 
{ 
    new ColorSampler("ColorSampler"); 
} 
public ColorSampler(String title) throws IOException 
{ 
    super(title); 
    setBounds(100,100,300,300); 
    addWindowListener(new WindowDestroyer()); 


    sampler = new ColorFrame(); 

    getContentPane().setLayout(null); 

    getContentPane().add(sampler); 

    sampler.setBounds(10,10,270,200); 
    FileInputStream stream = new FileInputStream("C:\\java input\\input.txt"); 
    InputStreamReader reader; 
    reader = new InputStreamReader(stream); 
    StreamTokenizer tokens = new StreamTokenizer(reader); 
    int numColors, counter; 
    numColors = 11; 
    counter = 0; 
    listOfColors = new colors[numColors]; 
    while(tokens.nextToken() != tokens.TT_EOF) 
    { 
     listOfColors[counter].name = (String)tokens.sval; 
     tokens.nextToken(); 
     listOfColors[counter].r = (int)tokens.nval; 
     System.out.println(listOfColors[counter].r); 
     tokens.nextToken(); 
     listOfColors[counter].g = (int)tokens.nval; 
     tokens.nextToken(); 
     listOfColors[counter].b = (int)tokens.nval; 
     counter++; 
    } 
    stream.close(); 
    colorList = new JList(); 
    colorList.addListSelectionListener(new ListHandler()); 
    String colorString[]; 
    colorString = new String[numColors]; 
    for(counter = 0; counter < numColors; counter++) 
    { 
     colorString[counter] = listOfColors[counter].name; 
    } 
    colorList.setListData(colorString); 
    getContentPane().add(colorList); 
    setVisible(true); 
    // TODO code application logic here 
} 
private class ListHandler implements ListSelectionListener 
{ 

    @Override 
    public void valueChanged(ListSelectionEvent e) 
    { 
     if(e.getSource() == colorList) 
     { 
      if(!e.getValueIsAdjusting()) 
      { 
       int i = colorList.getSelectedIndex(); 
       String s = (String) colorList.getSelectedValue(); 
       System.out.println("Position " + i + " selected: " + s); 
      } 
     } 
    } 

} 
} 

내가 값을 저장하는 데 사용하고 클래스 : 여기 내 코드입니다 배열에?

+3

... 당신은 또한 listOfColors 배열의 각 개체를 초기화로 while 루프를 변경해야 할 것 같아요? –

+0

plz 오류 로그를 게시 할 수 있습니다 콘솔 밖으로 넣어 –

+0

어떤 진술에서 예외가 발생합니다. 위의 의견을 적어주세요. –

답변

2

내가하는 당신이 NPE를 얻고있는 '선

counter = 0; 
listOfColors = new colors[numColors]; 
while(tokens.nextToken() != tokens.TT_EOF) 
{ 
    listOfColors[counter] = new Colors(); 
    listOfColors[counter].name = (String)tokens.sval; 
    tokens.nextToken(); 
    listOfColors[counter].r = (int)tokens.nval; 
    System.out.println(listOfColors[counter].r); 
    tokens.nextToken(); 
    listOfColors[counter].g = (int)tokens.nval; 
    tokens.nextToken(); 
    listOfColors[counter].b = (int)tokens.nval; 
    counter++; 
} 
+0

이것은 효과가 있습니다! 빠른 답변 주셔서 감사합니다. – Wenadin

2

은 이렇게해서 :

listOfColors = new colors[numColors]; 

배열이 아무것도 가지고 것을 의미하지 않는다. 사실,이 시점에서 그것은 null 값의 배열입니다. 이름과 색상 값을 설정하기 전에 각 요소에 대한 colors 객체를 만들어야합니다.

그리고 색상의 클래스 이름은 capital : Colors로 시작해야합니다.

+0

스타일에 대한 조언과 문제가 발생한 이유에 대한 설명에 감사드립니다. 색상의 클래스 이름을 변경했습니다. – Wenadin

관련 문제