我一直得到“非静态方法无法从静态上下文中引用”

时间:2013-01-02 13:31:08

标签: java

该方法应该接受3个参数 - String,double和String。然后它将返回一个要在main方法中打印的值。我该怎么做呢? 这就是我做的事情

    import javax.swing.JOptionPane;
    import javax.swing.JTextArea;

    public class coordinates
    {
        public static void main(String args[])
        {   
            double angle=0, az = 0;
            JOptionPane.showMessageDialog(null, "Hello, this is the 'Bearing to Azimuth' converter.\nFirst, you must input whether the angle is from the North or from the South, input the angle, and then input whether it is East or West.", "Bearing to Azimuth converter", JOptionPane.PLAIN_MESSAGE);
            String ns = JOptionPane.showInputDialog("Input n for North and s for South:");
            String inputangle = JOptionPane.showInputDialog("Input the angle in decimal format:");
            angle = Double.parseDouble(inputangle);
            String ew = JOptionPane.showInputDialog("Input e for East and w for West:");

            convertToSouthAzimuth(ns, angle, ew);


            JOptionPane.showMessageDialog(null, "The converted azimuth is " + az, "Bearing to Azimuth converter", JOptionPane.PLAIN_MESSAGE);
    } //end main method



        public double convertToSouthAzimuth(String ns, double angle, String ew)
        {
            double az = 0;
            if (ns.equals("n")||ns.equals("N")) {
                if (ew.equals("e")||ew.equals("E")) {az= 180+angle;}
                if(ew.equals("w")|| ew.equals("W")){az= 180-angle;}
            }
            if (ns.equals("s")||ns.equals("S")) {
                if (ew.equals("e")||ew.equals("E")) {az= 360-angle;}
                if (ew.equals("w")||ew.equals("W")) {az= angle;}
            }
            return az;
        } //end convertToSouthAzimuth method
    }

5 个答案:

答案 0 :(得分:6)

convertToSouthAzimuth方法尚未声明为static,因此编译器希望在该类的实例上调用它。但是,您的main方法 是静态的,因此没有该类的实例可用。

如果convertToSouthAzimuth仅适用于传递的参数,并且与当前实例无关,那么您可以将其更改为静态方法:

public static double convertToSouthAzimuth(...) {

答案 1 :(得分:1)

改变这个:

public double convertToSouthAzimuth(...) { }

public static double convertToSouthAzimuth(...) {}

因为main是一个静态方法,你不能在其中调用任何非静态方法。

答案 2 :(得分:1)

您需要将static关键字添加到方法convertToSouthAzimuth()中,因为您从main() - 方法中引用它本身就是一种静态方法。

如果您希望将其作为静态引用,可以通过将其包含在新类中来避免这种情况。

我故意遗漏了新类的构造函数。

这样的事情:

public class AzimuthConverter {

   public double convertToSouthAzimuth(String s, Double d, String s){
       return someValue;
   }
}

然后再做

AzimuthConverter myConverter = new AzimuthConverter()

并跟进

double myResult = myConverter.convertToSouthAzimuth(value);

答案 3 :(得分:1)

静态方法属于,而非静态方法属于实例类。

因此你需要做一些像

这样的事情
...
new coordinates().convertToSouthAzimuth(ns, angle, ew);
...

或者只是将convertToSouthAzimuth(...)方法设为静态,这在这种特殊情况下可能是更好的选择,因为它在coordinates类上没有任何方位(双关语)(它甚至可以被转移到辅助类,正如@limelights在另一个答案中建议的那样。)

干杯,

答案 4 :(得分:0)

其他人已经回答了您的错误,我想指出您的代码中的另一个增强功能。您可以使用String.equalIgonreCase(String)代替

        if (ns.equals("n")||ns.equals("N")) {

可以

        if (ns.equalIgonreCase("n")) {