非静态变量不能从静态上下文中引用
我是一个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, Short.MAX_VALUE)
.addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 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编程的noob。
静态意味着没有对象(类的实例,如new YourClass()
)。如果你有一个静态函数,它应该是“独立的”,所以它不能使用非静态的东西,因为它们使用真实对象中的东西(如成员变量等)
任何static
函数只能调用并使用其他static
函数。所以在那个环境中寻找麻烦。
thanksthanksthanks亚勒...它解决 – 2011-06-02 08:40:24
虽然可能有更正式的资源来解释这种(如Java语言规范),我经常发现自己检查这个网页,这些题型:
http://mindprod.com/jgloss/jgloss.html
它解释这些事情非常好,也为菜鸟;-) 你的情况:
thanksthanks亚勒...它解决 – 2011-06-02 08:40:19
@Karan,请“接受”最适合的答案,点击“接受”按钮 – 2011-06-02 09:57:56
更换你的主要有:
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();
}
});
}
感谢亚勒......也就迎刃而解了 – 2011-06-02 08:40:06
我用了 “Java编辑器”,我试图编译你的类。我得到了错误masseage
Reg1.java:93:16:非静态方法captureAudio()不能从静态上下文
原因引用的是:您在方法调用静 void main()一个方法,它需要一个对象的实例。如果一个方法不为静态宣布你需要follwoing语法“referenceObject.captureAudio()”
的captureAudio()
它是一个实例方法,它不能在main()
没有对象称为是静态的不声明为static从而。
正弦我看你已经在Reg1的run methid新实例中创建了,因此对于此对象调用方法captureAudio()
是好的。另外,不需要内置的private void Reg1()
方法,它可以让你永远不会打电话。我建议你将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();
}
});
}
得益于它解决..我会所有的人继续在未来给你麻烦....... – 2011-06-02 08:38:41
编译器在哪一行抱怨? – 2011-05-31 09:18:04
这是很多代码 - 你能更具体地说明哪一行导致错误?这通常由相关链接来判断,你是否阅读过这些内容? – 2011-05-31 09:19:03
这是相当明显的调用'captureAudio()'的'的main()'方法,以及其他潜在的问题 – 2011-05-31 09:23:23