Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建自己的类时出现非静态变量错误_Java_Arrays_Static_Non Static - Fatal编程技术网

Java 创建自己的类时出现非静态变量错误

Java 创建自己的类时出现非静态变量错误,java,arrays,static,non-static,Java,Arrays,Static,Non Static,我经常与非静态变量错误作斗争。不确定我是否正确理解了使用static和Not的目的。我有下面的代码,我试图将一个包含三列(日期、时间、温度)的csv文件解析到我自己定义的类中 这个位给了我一个非静态变量错误 TempData objt = new TempData(); 如果有人知道我做错了什么,我会非常感激。我试过谷歌,但找不到任何相关信息 package com.company; import java.io.File; import java.io.FileNotFoundEx

我经常与非静态变量错误作斗争。不确定我是否正确理解了使用static和Not的目的。我有下面的代码,我试图将一个包含三列(日期、时间、温度)的csv文件解析到我自己定义的类中

这个位给了我一个非静态变量错误

    TempData objt = new TempData();
如果有人知道我做错了什么,我会非常感激。我试过谷歌,但找不到任何相关信息

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;

        }

    }


}
package.com公司;
导入java.io.File;
导入java.io.FileNotFoundException;
导入java.util.*;
导入java.text.simpleDataFormat;
导入java.sql.Timestamp;
公共班机{
公共静态void main(字符串[]args){
日期-临时日期;
日期和时间;
双温;
ArrayList数据=新的ArrayList();
TempData objt=新的TempData();
//获取扫描程序实例
Scanner Scanner=新扫描仪(新文件(“smhi opendata.csv”);
//设置文件中使用的分隔符
scanner.useDelimiter(“;”);
//获取所有令牌并将它们存储在某个数据结构中
while(scanner.hasNext())
{
tempDate=newsimpledateformat(“dd/MM/yyyy”).parse(scanner.next());
testime=newsimpledateformat(“hh:mm:ss”).parse(scanner.next());
testemperature=Double.parseDouble(scanner.next());
目标数据(温度、时间、温度);
数据添加(objt);
}
//不要忘记关闭扫描仪
scanner.close();
}
公共类临时数据{
私人日期;
私人约会时间;
私人双温;
公共作废数据(日期d、日期t、双te){
日期=d;
时间=t;
温度=te;
}
}
}

首先,数据函数只是更新值,而不是创建新的TempData对象。其次,main函数不能在当前的位置使用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();

    }
}
公共类TempData{
私人日期;
私人约会时间;
私人双温;
公共温度数据(日期、日期时间、双温度){
this.date=日期;
这个时间=时间;
这个温度=温度;
}
公共静态void main(字符串[]args)引发异常{
日期-临时日期;
日期和时间;
双温;
ArrayList数据=新的ArrayList();
//获取扫描程序实例
Scanner Scanner=新扫描仪(新文件(“smhi opendata.csv”);
//设置文件中使用的分隔符
scanner.useDelimiter(“;”);
//获取所有令牌并将它们存储在某个数据结构中
while(scanner.hasNext()){
tempDate=newsimpledateformat(“dd/MM/yyyy”).parse(scanner.next());
testime=newsimpledateformat(“hh:mm:ss”).parse(scanner.next());
testemperature=Double.parseDouble(scanner.next());
TempData objt=新的TempData(tempDate、TELTIME、TELTEMPERATURE);
数据添加(objt);
}
//不要忘记关闭扫描仪
scanner.close();
}
}

问题在于您正在从静态上下文访问非静态类。
main
方法(
publicstaticvoidmain(){}
)具有关键字
static
,因此它位于类(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 {
        // ...
    }
}

要了解更多信息,请按照官方解释进行。

@Lino你在说什么?他正在调用默认构造函数。你的建议只会破坏一个方法(应该称为data)。删除void关键字“只会确保他的构造函数调用不再有效,并显示一条关于“错误类型”的错误消息,因为公共数据不是TempData的有效构造函数class@Lino告诉您将
TempData
a
static类创建为
。有点像构造函数的方法更像是一组setter。您应该在使用
扫描器
SimpleDataFormat.parse()方法的代码周围添加
try
-
catch