0

ここで、ファイルサーバープログラムを作成しています。これで、ソケットs=nullが書き込まれていることに気付きました。nullが指定された実際の理由を知りたいです。ObjectInputStreamまたはScannerに関連していると思いました。本当ですか。 ObjectInputStreamまたはScannerに関連しています。

Server.java 

    public class Server{
public static void main(String[] args){
Socket s=null;
ServerSocket ss=null;
ObjectInputStream ois=null;
ObjectOutputStream oos=null;
Scanner sc=new Scanner(System.in);


try
    {
ss = new ServerSocket(1234);
System.out.println("server is created");

    }
catch(Exception e)
    {
System.out.println(e.getMessage());
    }



try {
s=ss.accept();
System.out.println("connected");
oos = new ObjectOutputStream(s.getOutputStream());
oos.writeObject("Welcome");
ois= new ObjectInputStream(s.getInputStream());
    }catch(Exception e)
    {
e.printStackTrace();
    }
try{
String fil=(String)ois.readObject();
FileInputStream fis = new FileInputStream(fil);
int d;
String data="";
while(true)
        {
d=fis.read();
if(d==-1)
    break;
data = data+(char)d;
        }
oos.writeObject(data);
    }
catch(Exception e)
    {
System.out.println(e.getMessage());
    }
}
}

誰かが実際の理由を説明できますか?前もって感謝します 。

4

3 に答える 3

1

私があなたを正しく理解したかどうかはわかりませんが、コードの最初の行について話している場合、それは単純な初期化です。

優れたプログラミング手法では、プログラミング言語の実装に変数を初期化させてはならないことが示されています。初期値が特定の値になると規格に記載されている場合でも、規格が変更される可能性があり、ある時点で実装に欠陥が生じる可能性があります。したがって、変数は常に期待される初期値で初期化する必要があります。

コードの場合、null値は、接続が存在しないことを意味します。したがって、変数を初期化するときは、まだ接続していないため、ソケットを表すすべてのオブジェクトにnullを格納します。

これがお役に立てば幸いです。

于 2012-05-23T12:47:28.067 に答える
1

あなたの質問への答えは、変数をnull(コンパイラ/実行環境に初期化させるのではなく)別々に宣言して割り当てる場合に変数を初期化することをお勧めします。これは、ローカルの値が保証されていなかった初期のCに戻ります。明示的に設定されていない限り、変数はに初期化されました。

Javaコンパイラは、変数が初期化または設定されていない状態でアクセスされたことを検出すると、エラーを生成します。例えば:

    String s;
    try {
        s = "abc";
    } catch (Exception e) {

    }
    System.out.println(s);

ローカル変数が初期化されていない可能性があることを示すコンパイラエラーが最後の行に生成されます(try-clauseが割り当てられる前に例外をスローした場合、それが設定されることはありません)。 s

あなたの場合、try-blockの範囲外で宣言している場合でも、try-blockの範囲外でアクセスするSocketことはないため、これは問題ではないようです。

于 2012-05-23T12:57:44.763 に答える
0

私の知る限り、それは実際には理由によるものではありません。ただし、一般的には、すべての変数が使用される前に初期化されていることを確認することをお勧めします。

したがって、新しいソケットを割り当てたくないので、accept()が呼び出されるまで、それをnullとして割り当てるだけです。

これはこのコンテキストでは意味がありませんが、初期化されていない変数をどこかに渡すと、警告が生成されます。

于 2012-05-23T12:51:30.337 に答える