2015-06-07 5 views
9

Mój kod znajduje się poniżej. Kompiluje się dla mnie dobrze, jednak mój profesor mówi, że dostał błąd, ponieważ nie mam kilku zmiennych w mojej klasie uznanych za ostateczne. Wydaje się, że Eclipse nie ma z tym problemu na moim komputerze, więc nie wiem, jak naprawić to, czego nie widzę, jest złe.Dlaczego program zostałby skompilowany dla mnie, ale nie dla innej osoby?

Rozumiem, że niektóre zmienne muszą być ostateczne, aby działały w klasach zagnieżdżonych, ale te, które utworzyłem, działają dobrze, są ostateczne lub nie.

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.EventQueue; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 
import javax.swing.JButton; 

import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import java.util.Random; 

public class JColorFrame extends JFrame { 

    private JPanel contentPane; 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        JColorFrame frame = new JColorFrame(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the frame. 
    */ 
    public JColorFrame() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 522, 339); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     contentPane.setLayout(new BorderLayout(0, 0)); 
     setContentPane(contentPane); 

     JPanel panel = new JPanel(); 
     contentPane.add(panel, BorderLayout.NORTH); 

     JPanel panel_1 = new JPanel(); 
     contentPane.add(panel_1, BorderLayout.WEST); 

     JPanel panel_2 = new JPanel(); 
     contentPane.add(panel_2, BorderLayout.EAST); 

     JPanel panel_3 = new JPanel(); 
     contentPane.add(panel_3, BorderLayout.SOUTH); 

     Color[] color = new Color[8]; 
     color[0] = Color.black; 
     color[1] = Color.white; 
     color[2] = Color.red; 
     color[3] = Color.blue; 
     color[4] = Color.green; 
     color[5] = Color.yellow; 
     color[6] = Color.magenta; 
     color[7] = Color.orange; 

     JButton btnChangeColor = new JButton("Change Color"); 
     btnChangeColor.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       Random random = new Random(); 
       int random_1 = random.nextInt(4); 
       switch (random_1) { 
        case 0: 
         int random_2 = random.nextInt(8); 
         panel.setBackground(color[random_2]); 
         break; 
        case 1: 
         random_2 = random.nextInt(8); 
         panel_1.setBackground(color[random_2]); 
         break; 
        case 2: 
         random_2 = random.nextInt(8); 
         panel_2.setBackground(color[random_2]); 
         break; 
        case 3: 
         random_2 = random.nextInt(8); 
         panel_3.setBackground(color[random_2]); 
         break; 

       } 

      } 
     }); 

     contentPane.add(btnChangeColor, BorderLayout.CENTER); 
    } 
} 
+6

Używasz Java 7>, a twój profesor używa Javy 6 < – MadProgrammer

+2

@MadProgrammer: Bardziej przypomina to, że używają Java 8, a ich profesor używa Javy 7 lub niższej. – Makoto

+1

@Makoto Prawdopodobnie pominąłem Java 7: P – MadProgrammer

Odpowiedz

21

klasy wewnętrzne, takie jak ActionListener, nie ma dostępu do innych niż final zmiennych z zakresu, który go zawiera. W wersjach Java mniejszych niż 8 kompilator automatycznie zgłasza błąd, jeśli napotka taką sytuację.

W języku Java 8 kompilator po prostu wprowadzi zmienne final, jeśli nie zostaną one zmienione w pliku, ponieważ nie ma ich tutaj.

Aby uzyskać więcej informacji, zobacz this post.

Prawdopodobnie twój profesor używa Javy 7 lub starszej, więc twój kod się nie kompiluje. Po prostu wprowadź dowolne zmienne lokalne w swojej wewnętrznej klasie final.

Powiązane problemy