2017-07-27 57 views
0
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

回答

0

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(); 
} 
0

編譯失敗可以在

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){...} 
} 
0

有多個錯誤或錯誤與您的代碼:

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(); 
    } 
    }