2017-04-09 40 views
1

其他阶级差别调用方法我有3个班,Mainn,ReadFile的,和条目。在主类和Java中

ReadFile的基本上是我的类,它的所有文件I/O的东西。

我怎么能够访问我的Mainn类中的ReadFile就好了,但是当我试图在条目“e.openFile()”中访问它时,我得到一个表示标识符预期的错误。

我知道这可以通过在进入制作一个重载的方法OpenFile()是固定的,但是这是为什么需要输入,而不是在主类Mainn?

package homework6; 

public class mainn { 
    public static void main(String[] args){ 
     ReadFile r = new ReadFile(); 
     r.openFile(); 
     //r.readFile(); 
     r.skipFirst(); 
     String x[] = r.getData(); 
     String y[] = r.getData(); 
     String z[] = r.getData(); 

     System.out.println(x[0] + "," + x[1]); 
     System.out.println(y[0] + "," + y[1]); 
     System.out.println(z[0] + "," + z[1]); 

     r.closeFile(); 
    } 
} 

的ReadFile:

package homework6; 
import java.util.*; 
import java.io.*; 

public class ReadFile { 
    Scanner x = null; 

    public void openFile(){ 
     try{ 
      x = new Scanner(new FileInputStream(
        "C:\\Users\\Rohan Vidyarthi\\workspace\\Data.csv")); 
     } 
     catch(FileNotFoundException e){ 
      System.out.println("File not found error"); 
     } 
    } 

    public void readFile(){ 
     while (x.hasNextLine()) 
      System.out.println(x.nextLine()); 
    } 

    public void skipFirst(){ 
     x.nextLine(); 
    } 

    public String[] getData(){ //returns String[] with Date and ADJ Close 
     String[] temp; 
     String[] out = new String[2]; 
     temp = (x.nextLine()).split(","); 
     out[0] = temp[0]; 
     out[1] = temp[6]; 
     return out; 
    } 

    public boolean checker(){ 
     return x.hasNextLine(); 
    } 

    public void closeFile(){ 
     x.close(); 
    } 
} 

类条目:

package homework6; 

public class Entry extends ReadFile{ 
    ReadFile e = new ReadFile(); 
    e.openFile(); 

    double minn = Double.MAX_VALUE; 
    double maxx = Double.MIN_VALUE; 

    /*public String[] rMax(){ 
     String[] temp1; 
     String[] temp2; 
    } 
    */ 
} 
+1

你为什么认为一个条目应该是一个读文件?为什么两个类之间的继承? – GhostCat

+0

我有一个CSV文件,其中有很多数字,实际上我不知道我是新的,不知道什么时候它适合做出新的类哈哈.. – Panthy

+0

你真的想看看。继承不仅仅是将“扩展”放在某个类名后面。 A延伸意味着“A是B”......在你的情况下这会有意义吗?是输入文件吗?获得这样的东西与获得“有效”的代码一样重要! – GhostCat

回答

1

收到同样的错误,我建议你移动如下图所示的openFile()逻辑来ReadFile类的构造函数而这种做法会给你两个优点:

(1)scanner(这是ReadFile类的强制性变量)在类构造函数内部初始化,这样做更有意义并避免了所有NullPointerException,即有人在openFile()之前意外调用其他方法(始终确保所有必需实例变量,即数据正在初始化通过构造,我强烈建议使它作为一种实践,绝不允许任何对象被创建自由而不通过构造函数,这将避免大多数的问题)初始化的变量强制。

(2)将修复自动您的问题因为你不需要调用openFile()方法(当然,你不必是方法本身,ReadFile的构造已初始化扫描仪)。

public class ReadFile { 
    Scanner x = null; 

    public ReadFile() { 
     try{ 
      x = new Scanner(new FileInputStream(
        "C:\\Users\\Rohan Vidyarthi\\workspace\\Data.csv")); 
     } 
     catch(FileNotFoundException e){ 
      System.out.println("File not found error"); 
     } 
    } 

    public void readFile(){ 
     //add code 
    } 

    public void skipFirst(){ 
     //add code 
    } 

    public String[] getData(){ 
     //add code 
    } 

    public boolean checker(){ 
     return x.hasNextLine(); 
    } 

    public void closeFile(){ 
     x.close(); 
    } 
    } 

只要确保你不需要调用openFile()了,如下图所示:

public class Entry extends ReadFile{ 
    ReadFile e = new ReadFile();//initializes scanner as well 

    public String[] readFile() {//add any methods you like here in this like 
     return e.readFile(); 
    } 

    double minn = Double.MAX_VALUE; 
    double maxx = Double.MIN_VALUE; 
} 

为什么我能够访问的ReadFile我Mainn类就好了,但 当我尝试访问它在输入“e.openFile()”我得到 说标识符预期的错误。

在Java中,任何方法调用(如你r.openFile())的调用应该从另一种方法或构造函数或初始化(静态或实例初始化程序)来完成,所以答案是你的Mainn类,你在呼唤所述openFile()内部main(String[] args)方法而在你的Entry类的openFile()方法调用不裹内部任何上述码块(即,方法,构造,初始化)的

一个更重要的一点是,在一般当你说一个在面向语言对象扩展乙,这意味着A是B型的,但在你的代码Entry extends ReadFile没有多大意义,所以你应该避免这种情况。

+0

我明白你说了什么,但我仍然有一个问题。正如你可以在main看到的,我使用了许多在ReadFile中定义的方法,没有任何问题。现在,如果我试图在Entry中使用getData()方法,那么我有同样的错误。为什么? – Panthy

+0

更新了我的答案,你可以检查 – developer

+0

但是你遵循他怀疑使用继承的想法。但为什么应该是一个读取文件? – GhostCat

1

e.openFile();方法或构造函数。您不能在方法外部放置浮动代码。任何语句只能代码块内使用(即方法,构造函数,静态初始化)

+0

为什么不能'e.openFile()'在那里?这是如何“浮动”? –

0

如果你

public class mainn { 
    ReadFile r = new ReadFile(); 
    r.openFile(); 
    //r.readFile(); 
    r.skipFirst(); 
    String x[] = r.getData(); 
     ... 

你会mainn