Java 创建自己的类时出现非静态变量错误
我经常与非静态变量错误作斗争。不确定我是否正确理解了使用static和Not的目的。我有下面的代码,我试图将一个包含三列(日期、时间、温度)的csv文件解析到我自己定义的类中 这个位给了我一个非静态变量错误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
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
astatic类创建为。有点像构造函数的方法更像是一组setter。您应该在使用扫描器和SimpleDataFormat.parse()方法的代码周围添加try
-catch
。