ошибка нестатической переменной при создании собственного класса - PullRequest
0 голосов
/ 20 марта 2019

Я часто борюсь с нестатическими ошибками переменных. Не уверен, что я правильно понял цель, когда использовать статическое и нет. У меня есть код ниже, где я пытаюсь проанализировать CSV-файл с тремя столбцами (дата, время, температура) в класс, который я определил сам.

Этот бит дает мне ошибку нестатической переменной.

    TempData objt = new TempData();

Если кто-нибудь знает, что я делаю неправильно, я буду очень благодарен. Я пробовал Google, но не могу найти что-нибудь подходящее.

package com.company;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.*;
import java.text.SimpleDateFormat;
import java.sql.Timestamp;



public class Main {

    public static void main(String[] args) {

        Date tempDate;
        Date tempTime;
        Double tempTemperature;

        ArrayList<TempData> data = new ArrayList<TempData>();
        TempData objt = new TempData();


        //Get scanner instance
        Scanner scanner = new Scanner(new File("smhi-opendata.csv"));

        //Set the delimiter used in file
        scanner.useDelimiter(";");

        //Get all tokens and store them in some data structure
        while (scanner.hasNext())
        {
            tempDate = new SimpleDateFormat("dd/MM/yyyy").parse(scanner.next());
            tempTime = new SimpleDateFormat("hh:mm:ss").parse(scanner.next());
            tempTemperature = Double.parseDouble(scanner.next());
            objt.Data(tempDate, tempTime, tempTemperature);
           data.add(objt);
        }

        //Do not forget to close the scanner
        scanner.close();

        }


    public class TempData{
        private Date date;
        private Date time;
        private double temperature;

        public void Data (Date d, Date t, double te){
            date = d;
            time = t;
            temperature = te;

        }

    }


}

Ответы [ 2 ]

0 голосов
/ 20 марта 2019

Проблема в том, что вы обращаетесь к нестатическому классу из статического контекста. Метод main (public static void main() {}) имеет ключевое слово static, поэтому он находится в классе (статическом) контексте. Ваш внутренний класс TempData не является статическим, поэтому он относится к экземпляру (не статическому) контексту.

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

Переместите класс TempData в статический контекст:

public class Main {
    public static void main(String[] args) {
        // ...
        TempData objt = new TempData();
        // ...
    }

    public static class TempData{
        // ...
    }
}

Или получите доступ к TempData из нестатического контекста. Например:

public class Main {
    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        // ...
        TempData objt = new TempData();
        // ...
    }

    public class TempData {
        // ...
    }
}

Чтобы узнать больше об этом, вы можете следовать этому официальному объяснению.

0 голосов
/ 20 марта 2019

Прежде всего, функция Data просто обновляет значения, а не создает новый объект TempData.Во-вторых, основная функция не может использовать класс TempData, где она находится в данный момент.

Вместо этого я бы выбрал что-то вроде этого:

public class TempData {
    private Date date;
    private Date time;
    private double temperature;

    public TempData(Date date, Date time, double temperature) {
        this.date = date;
        this.time = time;
        this.temperature = temperature;
    }

    public static void main(String[] args) throws Exception {

        Date tempDate;
        Date tempTime;
        Double tempTemperature;

        ArrayList<TempData> data = new ArrayList<TempData>();

        // Get scanner instance
        Scanner scanner = new Scanner(new File("smhi-opendata.csv"));

        // Set the delimiter used in file
        scanner.useDelimiter(";");

        // Get all tokens and store them in some data structure
        while (scanner.hasNext()) {
            tempDate = new SimpleDateFormat("dd/MM/yyyy").parse(scanner.next());
            tempTime = new SimpleDateFormat("hh:mm:ss").parse(scanner.next());
            tempTemperature = Double.parseDouble(scanner.next());
            TempData objt = new TempData(tempDate, tempTime, tempTemperature);
            data.add(objt);
        }

        // Do not forget to close the scanner
        scanner.close();

    }
}
...