如何解决非静态变量不能从静态上下文中引用
我是Java新手,所以请多多包涵和帮助。 我的目标是先播放然后录制声音。 我使用netbeans IDE 6.8。这是代码:import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.sound.sampled.*;
import java.awt.event.KeyListener;
import java.io.File;
import java.io.IOException;
public class Reg1 extends javax.swing.JFrame {
AudioFormat audioFormat;
TargetDataLine targetDataLine;
public Reg1() {
initComponents();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings(\"unchecked\")
// <editor-fold defaultstate=\"collapsed\" desc=\"Generated Code\">
private void initComponents() {
jButton1 = new javax.swing.JButton();
setDefaultCloSEOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jButton1.setText(\"Stop\");
jButton1.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseReleased(java.awt.event.MouseEvent evt) {
jButton1MouseReleased(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING,layout.createSequentialGroup()
.addContainerGap(211,Short.MAX_VALUE)
.addComponent(jButton1,javax.swing.GroupLayout.PREFERRED_SIZE,135,javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(237,237,237))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING,layout.createSequentialGroup()
.addContainerGap(287,109,javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(65,65,65))
);
pack();
}// </editor-fold>
private void jButton1MouseReleased(java.awt.event.MouseEvent evt) {
targetDataLine.stop();
targetDataLine.close();
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokelater(new Runnable() {
public void run() {
new Reg1();
}
private void Reg1(){
KeyListener s;
try {
AudioInputStream audio = AudioSystem.getAudioInputStream(new File(\"name.wav\"));
Clip clip = AudioSystem.getClip();
clip.open(audio);
clip.start();
}
catch(UnsupportedAudioFileException uae) {
System.out.println(uae);
}
catch(IOException ioe) {
System.out.println(ioe);
}
catch(LineUnavailableException lua) {
System.out.println(lua);
}
captureAudio();
}
});
}
private void captureAudio(){
try{
audioFormat = getAudioFormat();
DataLine.Info dataLineInfo = new DataLine.Info(TargetDataLine.class,audioFormat);
targetDataLine = (TargetDataLine)
AudioSystem.getLine(dataLineInfo);
new CaptureThread().start();
}catch (Exception e) {
e.printstacktrace();
System.exit(0);
}
}
public static AudioFormat getAudioFormat(){
float sampleRate = 8000.0F;
int sampleSizeInBits = 16;
int channels = 1;
boolean signed = true;
boolean bigEndian = false;
return new AudioFormat(sampleRate,sampleSizeInBits,channels,signed,bigEndian);
}
class CaptureThread extends Thread{
public void run(){
AudioFileFormat.Type fileType = null;
File audioFile = null;
fileType = AudioFileFormat.Type.WAVE;
audioFile = new File(\"name.wav\");
try{
targetDataLine.open(audioFormat);
targetDataLine.start();
AudioSystem.write(
new AudioInputStream(targetDataLine),fileType,audioFile);
}catch (Exception e){
e.printstacktrace();
}
}
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
// End of variables declaration
}
由于我是Java编程的新手,请提供具体的指导。
解决方法
尽管可能有更多正式的资源来对此进行解释(例如Java语言规范),但我经常发现自己正在检查此网页上的以下类型的问题:
http://mindprod.com/jgloss/jgloss.html
对于菜鸟来说,它很好地解释了这些事情;-)
在您的情况下:
http://mindprod.com/jgloss/static.html也链接到:
http://download.oracle.com/javase/tutorial/java/javaOO/classvars.html
, 我使用了“ Java编辑器”,并尝试编译您的类。我得到了错误按摩
Reg1.java:93:16:无法从静态上下文引用非静态方法captureAudio()
原因是:您在方法static void main()中调用一个方法,该方法需要一个对象的实例。如果某个方法未声明为静态,则需要遵循以下语法\'referenceObject.captureAudio()\'
, 静态表示没有对象(类的实例,例如
new YourClass()
)。如果您有一个静态函数,它应该是“独立的”,所以它不能使用非静态的东西,因为它们使用真实对象中的东西(例如成员变量等)。
任何static
函数只能调用和使用其他static
函数。因此,在那种环境中寻找麻烦。
, 用以下代码替换您的main:
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
Reg1 r = new Reg1();
try {
AudioInputStream audio = AudioSystem.getAudioInputStream(new File(\"name.wav\"));
Clip clip = AudioSystem.getClip();
clip.open(audio);
clip.start();
}
catch (Exception e) {
System.out.println(e);
}
r.captureAudio();
}
});
}
, captureAudio()
不是声明为静态的,因此它是一个实例方法,在without6ѭ中没有静态对象的情况下无法调用它。
确实,我看到您已经在Reg1的运行方法中创建了新实例,因此可以为此对象调用方法“ 5”。另外,您无需使用您从未调用过的内部inner8ѭ方法。我建议您将main更改为类似的内容。
public static void main(String args[])
{
java.awt.EventQueue.invokeLater(new Runnable()
{
public void run()
{
Reg1 reg1 = new Reg1();
KeyListener s;
try
{
AudioInputStream audio = AudioSystem.getAudioInputStream(new File(\"name.wav\"));
Clip clip = AudioSystem.getClip();
clip.open(audio);
clip.start();
}catch(UnsupportedAudioFileException uae)
{
System.out.println(uae);
}catch(IOException ioe)
{
System.out.println(ioe);
}catch(LineUnavailableException lua)
{
System.out.println(lua);
}
reg1.captureAudio();
}
});
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。