2016-08-26 26 views
0

我創建了一個方法sReadFitsDataReadFitsData。我想在任何課程中調用此方法。例如,從類TestRead。但是,我得到了一個編譯錯誤:「sReadFitsData(String)的方法未定義類型TestRead」。我試圖從另一個類調用方法,但它是未定義的

這裏是我的代碼:

ReadFitsData.java

package readFits; 

import java.io.IOException; 

import nom.tam.fits.BasicHDU; 
import nom.tam.fits.Fits; 
import nom.tam.fits.FitsException; 
import nom.tam.fits.Header; 

public class ReadFitsData { 

public int[][][] sReadFitsData(String fitsFileName) throws IOException, FitsException { 
    int[][][] myData; 
    Fits f; // fits object 
    Header hdr; 
    Object fData; 

    try { 
     f = new Fits (fitsFileName); 
    } catch (FitsException fEx) { 
     throw new IOException ("Failed to open FITS file; "+fEx.getMessage()); 
    } 

    try { 
     BasicHDU hdu = f.getHDU(0); // 0 is for first header, 1 is for second one. 
     f.close(); 
     //hdr = hdu.getHeader(); 

     //int size = (int) hdr.getDataSize(); 

     fData = hdu.getData().getData(); // Object fData 
    } catch (FitsException fEx) { 
      throw new IOException ("Failed to get Data; "+fEx.getMessage()); 
    } 


    if (!fData.getClass().isArray()) { 
     throw new IOException ("Unknown HDU Data type: " + fData.getClass().getName());// + fEx.getMessage()); 
    } 

    myData = (int[][][]) fData; // cast the fData to an int[][][] 

    return myData; 
} 

} 

另一類用於調用此方法:

TestRead.java

​​

根據答案此外:

首先我做我的方法sReadFitsData公共靜態爲對象的獨立性。

其次我做了一個類的進口:

TestRead.java

import projectName.readFits.ReadFitsData; 

而同樣的編譯錯誤仍然存​​在。它應該是?:

int[][][] arr = sReadFitsData(fname); // error is still there 

當我把這個代碼用或不用進口它的確定:

int[][][] arr = ReadFitsData.sReadFitsData(fname); // working! 
+0

你寫「一組一維數組」是什麼意思?多擴展名FITS文件?一張桌子?在前者的情況下,你可能會使用ImageHDU。在FITS(幾乎)任何同質N-D陣列被稱爲「圖像」,因爲傳統上,它是一個圖像。但它不一定是。就FITS而言,它只是一些字節以及一些元數據(在標題中),說明如何遍歷這些字節。你究竟想要做什麼,以及你遇到什麼問題?您上面發佈的代碼不完整。 – Iguananaut

+0

當我谷歌nom.tam.fits第二擊是一個教程如何使用它。不是很好,但總比沒有好。也許上面的觀點認爲FITS中的任何N-D數組被稱爲「圖像」將有所幫助。它也必須是Java?我不知道你在做什麼,但是使用Python可能不太麻煩。當然,這一切都取決於你的目的是什麼... – Iguananaut

+0

「一組一維數組」我的意思是我的數據是一個三維多陣列,例如[620,90,2]。我想從fit文件讀取數據到這個數組中。 [這張圖片代表我的數據](https://s18.postimg.io/fj58kqq9z/271214az16fok0.png)。 –

回答

3

爲了能夠調用不同classes方法(更具體:不同的文件),你需要import那些classes

問題是,TestRead這個類應該怎麼知道方法sReadFitsData是誰,至少它不是自己的方法。 另一件事是,如果TestRead也會定義一個名爲sReadFitsData的方法,那麼該怎麼辦,您想以某種方式能夠區分這兩種方法。

有兩種方法可以解決此問題。首先,您可以在方法調用前指定full class path。您可以通過TestReadreadFits.ReadFitsData.sReadFitsData(fname)交換呼叫。
完整的類路徑由所有包和類本身組成。

第二,你可以import這個班,你可能想在這種情況下更喜歡什麼。只需在包裝聲明後立即將此行添加到TestRead類的開頭:import readFits.ReadFitsData;
它應該看起來像ReadFitsData類的其他進口產品。

好的,那是第一個問題。但是,它現在也不會編譯。你必須創建一個類ReadFitsData的實例,並調用其方法:

ReadFitsData data = new ReadFitsData(); 
data.sReadFitsData(fname); 

如果你想方法是獨立的對象,你需要使它static

public static int[][][] sReadFitsData(String fitsFileName) throws ... { 

然後你可以從任何地方(導入後)調用ReadFitsData.sReadFitsData(...)的方法。

在這一點上,我應該說,你正在努力與一些真正的基本Java事情。您可能會更好地閱讀或觀看一些初學者教程或書籍:)

您可能會得到一個IDE,例如eclipse,與Java一起工作。這些程序會自動導入類,因爲它們會檢測您可能想要使用的方法。他們也讓你選擇是否有多個。

+0

謝謝你的詳細回覆!根據你的回答,我做了一個補充,發現有沒有辦法不創建一個對象而不寫完整路徑。 –

相關問題