0

おそらくまだ宣言されていない変数に値を渡そうとしています。メインのソース クラスから別のクラスにいくつかの値を与えていますが、後で値がなくなったように見えます。

ソースコード:

server.java (メイン):

public class server {

public static void main(String[] args)  {

    //Print a simple message to the user to notify there is something going on...
    System.out.println("Starting server, please wait...");

    //Connecting all class files to the server.
    filehandler filehandlerclass = new filehandler();
    networking networkingclass = new networking();
    //End of class files connecting.

    //Preparing the filehandler's file information to open a new filestream.
    filehandlerclass.filetohandlename = "server";
    filehandlerclass.filetohandleextention = "ini";
    filehandlerclass.filetohandlepath = "configs\\";

    //Request a new filestream using the filehandler's file variables.
    filehandlerclass.openfilestream(filehandlerclass.filestream, filehandlerclass.filetohandle);

    //Checks if the filehandler has tried to open a filestream.
    if(filehandlerclass.filestreamopen == true) {
        //Request a check if the filestream was opened sucessfully.
        filehandlerclass.filestreamexists(filehandlerclass.filestream);
    }
    //If the filehandler has not tried to open a filestream...
    else    {
        System.out.println("Error: The filehandler does not seem to have tried to open a filoestream yet.");
        System.out.println("A possibility is that the server could not call the method from the filehandler properly.");
    }

    //Checks if the boolean "filestreamexists" from the filehandlerclass is true.
    if(filehandlerclass.filestreamexists(filehandlerclass.filestream) == true)  {
        //The filestream seems to exist, let's read the file and extract it's information.
        filehandlerclass.readfile(filehandlerclass.filestream);
    }
    else    {
        filehandlerclass.openfilestream(filehandlerclass.filestream, filehandlerclass.filetohandle);
    }
}
}

ファイルハンドラ.java:

//Imports the java.io library so the filehandler can read and write to text files.
import java.io.*;

public class filehandler    {

//Variables for the filehandler class.
public String filetohandlename;
public String filetohandleextention;
public String filetohandlefullname = filetohandlename + "." + filetohandleextention;
public String filetohandlepath;
public String filetohandle = filetohandlepath + filetohandlefullname;

//Boolean that is true if the filehandler's "openfilestream"-method has tried to open a filestream.
//Is false as long as none filestreams have been touched.
public boolean filestreamopen = false;

//Declares a variable for the filestream to access text files.
public File filestream;
//End of variable list.

//Called to open a filestream so the server can load properties from text files.
public void openfilestream(File filestream, String filetohandle)    {

    //Tell the user that a filestream is about to be opened.
    System.out.println("Opening filestream for \"" + filetohandlefullname + "\"...");
    //Open a filestream called "filestream" using the variable "filetohandle"'s value
    //as information about wich file to open the filestream for.
    filestream = new File(filetohandle);
    //Turn the boolean "filestreamopen" to true so next time the server checks it's
    //value, it knows if the filehandler has tried to open a filestream.
    filestreamopen = true;
}

//Boolean that checks if the filestream exists.
public boolean filestreamexists(File filestream)    {
    //Tell the user that a check on the filestream is going on.
    System.out.println("Checking if filestream for \"" + filetohandlefullname + "\" exists...");
    //If the filestream exists...
    if(filestream.exists()) {
        //Tell the user that the filestream exists.
        System.out.println("Filestream for \"" + filetohandlefullname + "\" exists!");
        //Make the boolean's value positive.
        return true;
    }
    //If the filestream does not exist...
    else    {
        //Tell the user that the filestream does not exist.
        System.out.println("Filestream for \"" + filetohandlefullname + "\" does not exist!");
        //Make the boolean's value negative.
        return false;
    }
}

//Called to read files and collect it's information.
public void readfile(File filestream)   {
    //Checks if the file that is going to be read is a configuration file.
    if(filetohandleextention == "ini")  {
        //Tell the user that a configuration file is going to be read.
        System.out.println("Extracting information from the configuration file \"" + filetohandle + "\".");
    }
}
}

ネットワーキング.java:

public class networking {

}

問題:

server.java はソース ファイルにコマンドを提供し、何をすべきかを伝えます。server.java がコマンドを与えない限り、ソース ファイルは単独では動作しません。このようにして、server.java に単純な関数呼び出しを記述して、さまざまなソース ファイルからより多くのタスクを実行できるようにすることを計画しています。

server.java は、変数が宣言される前に変数 "filetohandlename"、"filetohandleextention"、および "filetohandlepath" を渡すようであり、変数が宣言されると、値として "null" で宣言されます。

結果:

Java コンパイル/実行エラー。

コンパイルしてもエラーになりません。私が考えているのは、読み取りの適切な値になるファイルを指定する変数を与えることとのミスマッチです。また、「null.null」が存在しないか、コードを間違って書いたために、今のところ調べていない例外がスローされます。

最終リクエスト:

変数の値を受け取る方法を作成できるかどうか、または別のより適切な方法があるかどうかを知っている人はいますか? おそらく、server.java で変数の配列を作成し、その配列から値を収集できますか?

お時間をいただきありがとうございました。

4

2 に答える 2

3

これ:

public String filetohandlename;
public String filetohandleextention;
public String filetohandlefullname = filetohandlename + "." + filetohandleextention;

最初の 2 つの変数を null に初期化し、3 番目の変数を「null.null」に初期化します。filetohandlefullnameを構成するコンポーネント変数の 1 つを変更しても、 の値は変更されないことに注意してくださいfiletohandlefullname。それを実現したい場合はfiletohandlefullname、追加操作を実行するメソッドに置き換える必要があります。

これ:

public void openfilestream(File filestream, String filetohandle)  

別の変数filetohandleをメソッドに渡します。その変数は とは異なりますthis.filetohandle

このコード (上記) には多くの問題があると思いますが、次のようにします。

  1. 他の変数を介してインスタンス化された変数を、これを動的に実行するメソッドに置き換えます。そうすれvar1ば、 の値を変更すると予想される を変更するとvar2、メソッド return を介して自動的に変更されます。たとえば、プライベート メソッドを作成しgetFileToHandleFullName()、対応する変数をビン化します
  2. を持つスコープ クラス メンバthis
  3. 可能であれば、これらのメンバーを作成して、誤って変更しfinalないようにします
于 2012-11-07T00:03:14.847 に答える
0

この行

public String filetohandlefullname = filetohandlename + "." + filetohandleextention;

クラスをインスタンス化するときに実行されます(つまりfilehandler filehandlerclass = new filehandler();)。その時点で、両方の変数が設定されていないため、次のようfiletohandlefullnameに初期化されます。null.null

しかし、コードには他にも多くの問題があります。

//Request a new filestream using the filehandler's file variables.
filehandlerclass.openfilestream(filehandlerclass. filestream,filehandlerclass.filetohandle);

たとえば、同じインスタンスのフィールドであるパラメーターを渡しています。メソッドはすでにそれらにアクセスしているため、これはまったく役に立たず、非常に混乱します。

そしておそらく少し物議を醸す:

//Make the boolean's value positive.
return true;

コメントは、コードを明確にする場合にのみ有用です。コメントがなければ、あまり明白ではありません。コメントは 100% 真実である必要があり、よくあることですが、プログラムがコードに望んでいることではありません。この特定のケースでは、コメントが何が起こっているのかを明確にしておらず、実際にはメソッドの戻り値が設定されているため、これらの条件のいずれも満たされていません。説明のつかない「ブール値」ではありません。

于 2012-11-07T00:07:16.823 に答える