на нестатический метод нельзя ссылаться из статического контекста - PullRequest
3 голосов
/ 12 мая 2011

Я хотел бы понять это раз и навсегда.

Извините, пожалуйста, массу кода, вставленного ниже, но я не хочу упускать какие-либо подробности.

Единственное, что я изменил, - это загруженный URL. Но это не вызывает ошибку.

Я бы хотел вызвать мою функцию " readPosiitons ". Простое решение, сделайте его статичным. Реальное решение, я не уверен.

Пожалуйста, помогите мне лучше понять, как правильно решить эту ошибку.

Спасибо !!

            /*
             * To change this template, choose Tools | Templates
             * and open the template in the editor.
             */

            package PandL;

            import java.io.BufferedReader;
            import java.io.File;
            import java.io.IOException;
            import java.io.InputStreamReader;
            import java.net.MalformedURLException;
            import java.net.URL;
            import java.util.HashMap;
            import java.util.Scanner;
            import toolBox.Secretary;
            import toolBox.Secretary.positionObj;

            /**
             *
             * @author Jason
             *
             */
            public class GarageComm {
                public static void main(String[] args) throws MalformedURLException, IOException{
                    String retStr;
                    String startM;
                    String endM;
                    String myURL;
                    String[] Split1=null;
                    Integer lnCount;
                    HashMap hashPos=new HashMap();
                    hashPos= readPositions("holdingsBU.txt");//the error is here

                    myURL="http://myUrl?s=";

                    URL url = new URL(myURL);
                    BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));



                    in.close();
                }

                public HashMap readPositions(String destFile){

                    HashMap<String, Secretary.positionObj> hashPositions=new HashMap<String,positionObj>();
                    Secretary mySecretary=new Secretary();
                    try{
                        File F=new File(destFile);
                        if(F.exists()){
                            System.out.println("File Exists: "+F.exists());
                            System.out.println(destFile);
                            Scanner sC= new Scanner(F);

                            while (sC.hasNext()){
                                String[] Splitter1;
                                Secretary.positionObj position=mySecretary.new positionObj();


                                Splitter1=sC.nextLine().split(",");
                                position.positionDate=Double.parseDouble(Splitter1[0]);
                                position.positionTicker=(Splitter1[1]);
                                position.positionOpen=Double.parseDouble(Splitter1[2]);
                                position.positionPrice=Double.parseDouble(Splitter1[3]);
                                position.positionSMA=Double.parseDouble(Splitter1[4]);
                                position.positionUpdated=Double.parseDouble(Splitter1[5]);
                                position.priceUpdated=Double.parseDouble(Splitter1[6]);
                                position.updateDate=Double.parseDouble(Splitter1[7]);


                                hashPositions.put(position.positionTicker.trim(), position);

                            }


                        }else{
                            System.out.println("File Created: "+ F.createNewFile());
                            System.out.println("----No previous positions----");
                        }

                    }catch (Exception E){
                        System.err.println(destFile + " does not exist.");
                        hashPositions.put("ERROR", null);
                        E.printStackTrace();
                    }
                    return hashPositions;
                }
            }

Ответы [ 5 ]

2 голосов
/ 12 мая 2011

Это типичный ум для новых программистов на Java.

Метод static не принадлежит объекту. Не static метод принадлежит объекту.

Для запуска программы используется соглашение main, и требуется, чтобы этот метод был статическим.

Хитрость от метода static к методу, отличному от static, заключается в том, что вы должны создать объект, чтобы можно было вызывать метод для этого. То есть new GarageComm().readPositions(...). Я просто не думаю, что вам нужно здесь, поэтому было бы проще просто пометить readPositions как статические.

2 голосов
/ 12 мая 2011

Реальное решение? Не кладите столько вещей в метод main(). Это для новичков.

Java - объектно-ориентированный язык. Поместите логику в методы, связанные с классом GarageComm. main() должен сделать чуть больше, чем создать экземпляр и вызвать его методы.

Измените это так:

            GarageComm gc = new GarageComm();
            hashPos= gc.readPositions("holdingsBU.txt");//the error is here
1 голос
/ 12 мая 2011

Вам нужно сделать вашу функцию статичной:

public static HashMap readPositions(String destFile) {
...
}

Создание экземпляра GarageComm также будет работать, но это плохая практика программирования на Java, поскольку у этого объекта нет состояния.

0 голосов
/ 12 мая 2011

Если метод не является статическим, то он должен вызываться «на» объекте. При вызове метода из нестатического метода подразумевается этот объект - это объект, к которому был вызван первый метод. Но при вызове его из статического метода подразумеваемый объект отсутствует, поэтому для вызова метода необходимо указать объект:

GarageComm gc = new GarageComm();
hashPos= gc.readPositions("holdingsBU.txt");

Поскольку GarageComm не имеет собственного состояния, нет смысла создавать объект GarageComm, поэтому вы также помечаете метод как статический, поэтому объект для его вызова не требуется.

0 голосов
/ 12 мая 2011

В этом случае хорошей идеей будет сделать метод статичным. Другой способ - использовать

  new GarageComm().readPositions("holdingsBU.txt")

вместо.

Итак, почему эта ошибка?

Статический метод не может вызывать нестатический метод в том же классе. Звучит странно, но для этого есть причина. Учтите это:

  • Нестатические методы может зависеть от состояния объектов, например, от переменной экземпляра.

  • Статические методы могут быть вызваны извне без создания экземпляра

Теперь, если мы позволим статическим методам играть нестатическим методом (и нестатическими переменными), они могут завершиться с ошибкой. Так что это своего рода профилактика.

Когда мне следует подумать о том, чтобы сделать метод статичным?

А теперь подойди, почему бы не сделать метод static? ,

Очень хорошо, вы должны сделать метод статическим, если его функциональность не зависит от состояния объекта.

Если он просто использует переданные параметры и некоторые статические элементы (статическая переменная, статические методы) и возвращает (с / без результата, выбрасывая исключение что-либо), рассмотрите возможность сделать его статическим методом.


обновление: выглядело так, как будто этот пост запутал пару человек, поэтому обновил ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...