错误的符号类型,代码uncompileable

错误的符号类型,代码uncompileable

问题描述:

import javax.sound.sampled.*; 
import java.io.*; 
import javax.swing.*; 

class muse{ 
// this plays music files 

    Thread.UncaughtExceptionHandler h = new Thread.UncaughtExceptionHandler() { 
    public void uncaughtException(Thread music, Throwable ex) { 
    System.out.println("Uncaught exception: " + ex); 
    }}; 

    String dian="yun.wav"; 

    static void mate(String dian) 
    { 
    Thread music = new Thread(dian) 
    { 
     public void run(String dian) 
     { 
     try 
     { 
      Clip clip= null; 
      File in = new File(dian); 
      AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(in); 
      clip = AudioSystem.getClip(); 
      clip.open(audioInputStream); 
      clip.start(); 
      JOptionPane.showMessageDialog(null, "Click OK to stop music"); 
      clip.drain(); 
     } 
     catch (UnsupportedAudioFileException | IOException | LineUnavailableException ex) 
     { 
      ex.printStackTrace(); 
     } 
     throw new RuntimeException(); 
     } 
    }; 
    } 

    public static void main(String args[]) throws InterruptedException { 
    music.start(); 
    } 

} 

我创造了这个代码,这样我就可以输入另一个java文件的歌曲文件名然而代码最终被不可编译即使是在NetBeans中没有红色的错误。 如果我删除静态无效的队友(字符串店){} 的代码工作正常,任何人可以帮助解释为什么它不编译或允许代码从另一个java文件错误的符号类型,代码uncompileable

+2

请发布您在编译时收到的完整错误。另外,请尝试重新格式化您发布的代码以包含缩进。 – Eric

+0

*但是,即使netbeans中没有红色错误,代码最终仍然是不可编译的。*这是什么意思? – shmosel

music对象声明运行的替代在静态方法mate中,在本地声明并且在主方法中不可访问。

尝试修改你的例子:

static Thread mate(String diane) { 
    return new Thread(dian){ 
    ... 
} 

,然后在你的主要方法

public static void main(String args[]) throws InterruptedException { 
    Thread music = mate("filename"); 
    music.start(); 
} 

编译失败可以在

public static void main(String args[]) throws InterruptedException { 
     mate(dian); 
     music.start(); 
} 

因为音乐变量不发生在mai可访问的范围内定义N()。

易破解你可以制作线程音乐变量是一个私有静态变量,所以主要可以访问它。

private static String dian = "yun.wav"; 
private static Thread music = null; 

static void mate(String dian){ 
      music = new Thread(dian){...} 
} 

有多个错误或错误与您的代码:

1)音乐是不是主要方法可见,你可以声明为类变量是可见的

2)你逝去run()的一个参数(现在它不覆盖Thread类的方法),所以当你在音乐上调用start()时,它不会执行任何操作,因为它会调用Thread类的Run方法。这就是为什么你需要删除传递给run()的String参数。

3)你是硬编码的文件名。你可以把它作为命令行的输入。

class muse{ 
    //music will be available to main method 
    private static Thread music ; 
    // this plays music files 

    Thread.UncaughtExceptionHandler h = new Thread.UncaughtExceptionHandler() { 
    public void uncaughtException(Thread music, Throwable ex) { 
     System.out.println("Uncaught exception: " + ex); 
    } 
    }; 

    static void mate(String dian){ 
    music = new Thread(dian){ 

    //removed argument so it can run when you call start(); 
    @Override 
    public void run(){ 

     try{ 
     Clip clip= null; 
     File in = new File(dian); 
     AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(in); 
     clip = AudioSystem.getClip(); 
     clip.open(audioInputStream); 
     clip.start(); 
     JOptionPane.showMessageDialog(null, "Click OK to stop music"); 
     clip.drain(); 
    } catch (UnsupportedAudioFileException | IOException | LineUnavailableException ex) { 
      ex.printStackTrace(); 
    } 
    throw new RuntimeException(); 
    } 
    }; 
    } 
    public static void main(String args[]) throws InterruptedException { 
    String dian=null; 
     //you can take dian as inut file from command line also using scanner 
     Scanner s=new Scanner(System.in); 
     dian=s.next(); 
     s.close(); 
     //////////// 

     //call Mate() so it will create a new new music thread with clip assigned to dian; 
    mate(dian); 
    //start music 
    music.start(); 
    } 
    }