2017-04-09 38 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