ちくのう症(蓄膿症)は「菌」が原因!?

お世話になります、androidでsocket通信を行なうプログラム(Wifi経由)を作成しておりますが、周期的に何度も接続、通信、切断をくりかえしておりますと、ソケットの.connectをするところで以下のエラーが出ます。

java.net.ConnectException: failed to connect to /192.168.10.12 (port 50000): connect failed: ENOBUFS (No buffer space available)

周期動作としては、
ソケットの接続後、受信待ち状態はスレッド内でソケットのInputStreamの.read()で行い(読み取ることができるまでブロックされるメソッド)、送信は、別のスレッドを起こしてソケットのOutputStreamでのflush()で送信しています。ある周期的タイミングで切断の手順を踏みます。

エラーの内容からして、切断するメソッド発行時にちゃんとリソースが解放されていない?のではないかと考えます。今、私がソケットを閉じよとする際に発行しているメソッドは以下になります(順同)
(1)ソケットのOutputStream.close
(2)ソケットのInputStream.close
(3)ソケット.close


正常にソケット回りのリソースを解放する手順としてソケットの閉じる方法は間違っていますでしょうか?
ちなみに、このエラーが出た後はインターネットへの接続も不可状態になり、端末を再起動しないと復帰しません。
大変困っております、お詳しい方おられましたら、よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

No.1です。



connectエラー発生時にTIME_WAIT状態のものがないことが確認できたのだったら、
この件とは別の問題なのだと思いますが、この質問をするなら、どれくらいの時間間隔で
繰り返しているかだけでなく、エラーが発生するのがどれくらいの回数を繰り返して
なのか、あるいはどれくらいの時間を繰り返してなのかもちゃんと書いた方がよいと
思います。
1分間隔でconnectしているのだとしたら、1時間繰り返しても60コネクション程度
なので、もし1時間程度で発生するのだったら、メモリ不足になるほどメモリを
消費しているという可能性は低いかもしれません。もちろん1コネクション生成に
あたってアプリが膨大なメモリを使っていて、それがうまく解放されてないのでしたら
メモリ不足になる場合もあると思います。そうであればメモリ使用量を監視すれば
なにかわかると思います。

また、繰り返し周期を2倍遅くしたら、エラーが発生し始める時間も2倍遅くなるのか、
それとも回数に依らず一定時間でエラーが発生し始めるのかを試してみると、
エラー発生要因を探る手がかりになると思います。

あと、ソケット切断後にwifiを切断しているというのも何のためにどのようにしている
のかよくわかりませんでした。
これってwifiの設定をあなたのアプリが勝手にOFFにするということなのでしょうか?
なぜアプリが勝手にwifiの設定をOFFにするのかよくわからなかったので、じゃあwifiを
切断しなかったらどうなるのかというのも試してみた方がよいと思いました。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。いろいろやってみましたが、瞑想しています。。エラーが起こるのは、1分間隔で1000~2000回動作させた場合に起こることが多いです、が、イメージとしては毎回同じタイミングで出ているという感覚ではないです。WifiのOFF/ON(Wifimanager#enabled(true/false))はシステムの都合上、3G回線につないで、インターネットに接続するためです。ソケット接続は自作wifi機器のAPに対して行いますが、そのAPの先にはインターネットはいないため、このような動作をさせています。なので、実際にはwifiON→APに接続→ソケット接続→ソケットで通信→ソケット切断→WifiOFFを繰り返しています。また、ご指摘いただいたようにWifiをつないだままの状態で、ソケット接続・通信・切断をくりかえしてみましたところ、5000回以上エラーはでませんでした。

お礼日時:2015/01/28 20:18

お役に立てるかどうか分かりませんが、



RFC5802 で、

For the SCRAM-SHA-1/SCRAM-SHA-1-PLUS SASL mechanism, servers
SHOULD announce a hash iteration-count of at least 4096. Note
that a client implementation MAY cache ClientKey&ServerKey (or
just SaltedPassword) for later reauthentication to the same
service, as it is likely that the server is going to advertise
the same salt value upon reauthentication. This might be
useful for mobile clients where CPU usage is a concern.

と書いてあるのを、見つけました。
    • good
    • 0

TCP/IPプロトコルでは、切断を開始した側は切断手順の最後に必ず


タイムアウト待ち(TIME_WAIT状態)になることをご存知ですか?
http://www.atmarkit.co.jp/ait/articles/0402/13/n …
の「TCPの状態遷移図」を参照してください。

これは、OutputStreamだけを先に閉じるハーフ・クローズ手順でも同じです。
http://www.geocities.jp/taka_owl2005/job/UNIX/ne …
も参考にしてください。

このTIME_WAIT時間はシステムによってデフォルト値が異なりますが、
Windowsで240秒、CentOSで60秒です。Androidがどうなっているか知りませんが
おそらくLinux系で60秒くらいだと思います。
コネクションの接続/切断周期がこれより短いのであれば、TIME_WAIT状態の
コネクションがどんどん増えて行き、確実にリソース不足になります。

このTIME_WAIT時間の設定を自分の接続/切断周期以下にすればリソース不足は
解消されると思いますが、この値はネットワーク状態に応じて決めるべきもの
であり、アプリの都合で変えるべきものではありません。
根本的には、頻繁な接続/切断の繰り返しを避けるよう設計する必要があります。

この回答への補足

丁寧なご回答ありがとうございます。

私のほうでもTIME_WAITについて疑ってみましたが、おっしゃるとおりandroidのタイムウエイトは60秒であるようでした。(実際にnetstatというアプリで監視してみますと、TIME_WAIT状態になったものは60秒後に消えました)

私の作っているシステムは60秒周期で1つのソケットをandroid端末側から接続して、双方通信して、android端末側から切断するという動作を行なっております。ちなみにWifiの通信の切断も
ソケット切断の3秒後に実施しています。

60秒周期で動作を繰り返しておりますので、TIME_WAIT状態のものがたくさん生成されている状態は考えにくい+実際にENOBUFSが起こっている状態でnetstatアプリで確認したところ、TIME_WAITがたくさんある状態ではありません(むしろLISTENなプロセスが1つあるだけ、のような状態です)

他に疑わしい事柄はありますでしょうか?

ソケットプロセスがTIME_WAITにある状態でWifiを切断するのがまずい?とかあるのでしょうか・・・。

補足日時:2015/01/22 16:30
    • good
    • 0
この回答へのお礼

>No.1様 またがってすみません。wifiを切断しなければ問題なく動作しました。wifiのON/OFFのみを十分に繰り返したのち、ソケット接続を実施しますと問題なく接続できました。具体的な実装に問題があるのでしょうか?wifiは毎回接続したいSSIDの接続履歴を削除し,WifiConfigrationで新たにnetidを取得して接続します。socketはsocket.connect(,)で接続した後、InputStream(inとします)・OutputStream(outとします)を取得し、in.read(byte[])を∞ループで実施し、受信状態を常に保ちます。outはout.wite,out.flushで送信します。通信データは10byte程度です。そして、ある周期タイミングが来た時点で out.close in.close socket.close の順にクローズしていきます。

お礼日時:2015/01/28 20:33

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QAndroidのソケット通信(初歩)

Androidでソケット通信を行いたいなのですが
エミュレータ環境でも実機環境でもうまく動作しません。
何かを送信するまでもなくソケット作成の時点で落ちてしまいます。

通常のJavaプログラム間でなら通信できるのですが、何かやり方が間違っているのでしょうか?

(1)PC側でJavaのサーバプログラムを起動しておく。
(2)Androidのエミュレータあるいは実機で起動
(3)Androidのボタンを押してソケット作成(下記プログラムが実行される)
(4)Android側が強制終了する

以下の単純なプログラムを使用しています。
また、IP、Portは正しくファイアウォールも無効にしています。

Socket socket = null;
try {
socket = new Socket("***.***.***.***", ****);
} catch (UnknownHostException e) {
System.err.println("Don't know about host");
} catch (IOException e) {
System.err.println("Couldn't get I/O for the connection to host");
}

Androidでソケット通信を行いたいなのですが
エミュレータ環境でも実機環境でもうまく動作しません。
何かを送信するまでもなくソケット作成の時点で落ちてしまいます。

通常のJavaプログラム間でなら通信できるのですが、何かやり方が間違っているのでしょうか?

(1)PC側でJavaのサーバプログラムを起動しておく。
(2)Androidのエミュレータあるいは実機で起動
(3)Androidのボタンを押してソケット作成(下記プログラムが実行される)
(4)Android側が強制終了する

以下の単純なプログラムを使用し...続きを読む

Aベストアンサー

投げられている例外名 NetworkOnMainThreadException でぐぐったらこんなページが出てきました。たぶんこれが原因でしょう。

http://garnote.com/2012/10/android-os-networkonmainthreadexception.html

Qandroidのsocketエラー

androidのソケット通信プログラムを作成しています。
何度もソケットの接続・切断を繰り返していると、以下のエラーが発生します。
Socket.connect メソッド(接続)で発生しています。
socketは毎回.closeメソッドで切断しています。

このようになると、端末を再起動しない限りソケット接続を再度行なうことはできない模様です。このエラーの発生理由がわかりません。お詳しい方おられましたら何卒よろしくお願いします。

ちなみに利用しているandroid端末はKYL21(京セラ androidバージョン4.0.4)です。


01-09 09:06:46.418: W/System.err(29936): java.net.ConnectException: failed to connect to /192.168.10.12 (port 50000): connect failed: ENOBUFS (No buffer space available)
01-09 09:06:46.418: W/System.err(29936): at libcore.io.IoBridge.connect(IoBridge.java:114)
01-09 09:06:46.418: W/System.err(29936): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
01-09 09:06:46.418: W/System.err(29936): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:460)
01-09 09:06:46.418: W/System.err(29936): at java.net.Socket.connect(Socket.java:838)
01-09 09:06:46.418: W/System.err(29936): at java.net.Socket.connect(Socket.java:791)
01-09 09:06:46.418: W/System.err(29936): at com.example.simple_test.Wifi_Service.Socket_Connect(Wifi_Service.java:2033)
01-09 09:06:46.428: W/System.err(29936): at com.example.simple_test.Wifi_Service$10.run(Wifi_Service.java:1938)
01-09 09:06:46.428: W/System.err(29936): Caused by: libcore.io.ErrnoException: connect failed: ENOBUFS (No buffer space available)
01-09 09:06:46.428: W/System.err(29936): at libcore.io.Posix.connect(Native Method)
01-09 09:06:46.428: W/System.err(29936): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85)
01-09 09:06:46.428: W/System.err(29936): at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
01-09 09:06:46.428: W/System.err(29936): at libcore.io.IoBridge.connect(IoBridge.java:112)
01-09 09:06:46.428: W/System.err(29936): ... 6 more

androidのソケット通信プログラムを作成しています。
何度もソケットの接続・切断を繰り返していると、以下のエラーが発生します。
Socket.connect メソッド(接続)で発生しています。
socketは毎回.closeメソッドで切断しています。

このようになると、端末を再起動しない限りソケット接続を再度行なうことはできない模様です。このエラーの発生理由がわかりません。お詳しい方おられましたら何卒よろしくお願いします。

ちなみに利用しているandroid端末はKYL21(京セラ androidバージョン4.0.4)です。


01-...続きを読む

Aベストアンサー

connect failed: ENOBUFS (No buffer space available)

とあるのだから、
接続の記録が、どこかのバッフアにどんどん溜まっていって、
バッファを使いきったのだと思います。

再起動すると、
バッファも空になるので、その場所を使って
接続記録を残しながら正常に接続できる

と考えます。

もし、バッファの使用状況が見れるなら使われているアドレスを調べてみれば
はっきりします。

Qflush()とclose()について

Javaを独習Javaで独習しています。現在、入出力の所まできたのですが、Writerクラスのclose()とflush()の違いがわかりません。それぞれのメソッドの意味はわかるのですがそれらを使う目的がわかりません。flush()は「バッファ付けデータをそのストリームで表されている物理デバイスに書き込む」とあるのですが、サンプルには(バッファ付け文字ストリームの単元にも)flush()は一度も出てこずclose()のみで書き込みが行われています。探したのですが独習Javaのサンプルの中には結局flush()は一度も出てきませんでした。この二つの違いはなんなのでしょうか?初心者のためわかりにくい質問かとは思いますがよろしくお願いします。

Aベストアンサー

フラッシュすれば、ファイルやその他物理デバイスに強制的にバッファの内容が出力されるということは、理解されていると考えてよいですね?

で、なかなかストリームをクローズできない(またはしない)場合には、いつまで経ってもバッファの内容が物理デバイスに出力されないかも知れませんよね?でも、適当なタイミングで定期的にフラッシュすれば、その時点でバッファに溜まっている内容が物理デバイスに出力されます。

そのサンプルの場合は、書き出してすぐ?クローズしちゃうため、明示的なフラッシュは必要なかったんだと思いますが、

・フラッシュは、(ストリームを閉じずに)バッファの内容を強制的に物理デバイスに出力する。
・クローズは、(フラッシュされていなければフラッシュしてから)そのストリームを閉じる。

とまぁ、目的も内容も全然違うわけです。

QAndroid Socket.connectエラー

Androidでソケット通信するプログラムを作っています。

PC側がソケットサーバーをたてて(accept)、
Android側でクライアントとして接続(connect)するようにしています。

connectを実行している部分のソースは以下のようにしています。

-----------------
String ip = "192.168.XX.XX"; <-PCのIPアドレス
int port = 9999;

socket = new Socket();
InetSocketAddress addr = new InetSocketAddress(ip, port);
try{
socket.connect(addr);
return true;

}catch(IOException e){
e.printStackTrace();
return false;
}
------------------

上記やり方でまずはエミュレータで試したところうまく行きました、その後
実機に入れて同じように実行したところconnectのところで例外が飛んできます。
メッセージは"no route to host"でした。

実は全く同じソースで以前は実機でもできていたはずなんですが、
最近試したところできなくなっているようでした。

Android端末はXperia Arcですが、OSを2.3.4にバージョンアップしたことくらいで
以前と特に変わったところはないと思うのですが

原因として何が考えられるでしょうか?
よろしくおねがいします。

Androidでソケット通信するプログラムを作っています。

PC側がソケットサーバーをたてて(accept)、
Android側でクライアントとして接続(connect)するようにしています。

connectを実行している部分のソースは以下のようにしています。

-----------------
String ip = "192.168.XX.XX"; <-PCのIPアドレス
int port = 9999;

socket = new Socket();
InetSocketAddress addr = new InetSocketAddress(ip, port);
try{
socket.connect(addr);
return true;

}catch(IOException ...続きを読む

Aベストアンサー

無線LANで接続してないからですよ。

通常はUSBでの通信はフラッシュメモリと同じ扱いなので。

もし本当にUSBで以前できたなら擬似ロケーションの設定等をみてください。

Qinterface,extend,implementのちがい

お世話になります、

Javaを勉強しているのですが、
interface,extend,implementの使い分けがわかりません。

私の解釈としては、
(1)interfaceは、グローバル変数の定義、グローバルメソッドの定義(実装はしない)。

(2)extendは、extendクラスを親クラスとして親クラスの機能を使用できる。

(3)implementは…,implementもextendと同じような意味だと解釈しているんですが、違う点は、implementで定義してあるメソッドは、使用しなくても、実装しなければならないという点でしょうか?

とにかくこの3つのを使い分けるコツとかあれば教えてください。
よろしくお願いします。

Aベストアンサー

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば、getStringLength()メソッドなどが
あったほうが良いでしょうか。
このgetStringLength()メソッドは、2バイト文字も1バイト文字も「1文字」
と数えてくれると言う点で、まさに、日本語クラス用のメソッドだと言えるでしょう。

例えば、Java的に記述すると、、、
class Japanese {
public int getStringLength() {
  ・・・
return strlength;
 }
 ・・・
}

class TextField {
・・・
}

class JTextField extends TextField, extends Japanese {
・・・・
}

C++ではそのように実装するでしょう。
しかし、Javaにはこのような高度な機能はありません。

そこで、生まれた苦肉の策が、「interfaceとimplements」です。

interface Japanese {
public int getStringLength(); // interfaceは実装を含まない!
                 // すなわち「実装の継承」ができるわけではない。
}

class TextField {
・・・
}

class JTextField extends TextField implements Japanese {
・・・・
public int getStringLength() {
  ・・・
return strlength; //implementsの実装を「各クラスで」実装してやる必要がある。
 }
}


結局のところ、Javaでは、複数のクラスを親クラスには持ち得ないため、継承できなかったクラスは「各クラスで実装してやる必要性」があるのです。


ではどのように使うのが効果的か?

なまえのままです。「代表的なインターフェイス」にたいしてinterfaceを使うのが良いと思います。

例えば、プレイヤー系であれば、ビデオ・コンポ・ウォークマン・などにかかわらず、
interface controlpanel {
public play();
public stop();
public next();
public back();
}
というような基本的インターフェイスを「持っているべき」です。

こうすることで、それぞれのクラス宣言の際に、これらの「インターフェイスを持っているべきであり、実装されるべきである」ということを「強く暗示」することができます。
class videoplayer extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

こうすることで、同様のクラスを作成するユーザーは、
「プレイヤー系は、4つ操作が出来るコントロールパネルをインターフェイスとして持つべきなのだな!?」という暗示を受け取り、自分のクラスでもそれを模倣するでしょう。

class mp3player extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

また、これらのクラスを使用するユーザーも、「implements controlpanel」という
表記を見て、「4つの基本操作は押さえられているのだな!」という基本中の基本動作を抑えることが出来ます。

まとめると、クラスに「こういう特徴もたしてください!」「こういう特徴持ってますよ!」という一種の暗示的警告や方向性を与えることができるわけですね。

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば...続きを読む

Qjavaでunsignedは使えないのですか?

Eclipseを使い始めた初心者です。
short型変数を符号無しで宣言しようと思ったのですが、
赤の下線が出てしまってエラーの扱いになってしまっています。

javaではunsignedは使えないのでしょうか?
使えないのであれば、その理由と対処策を教えていただけましたら嬉しいです。
宜しくお願い致します。

Aベストアンサー

unsigned short などのような構文はありませんが、とりあえず負の値を使いたくないのなら char型を数値のように使えばよろしいかと思います。
char型のとりうる範囲は0~65535で、範囲外の数値はint型とみなされます(数値を直接代入する場合のみ)。
ただし負のintをcharにキャストすると上位ビットが欠落します。

char c;
c = 0;
c = 65535;
c = 65536; ←コンパイルエラー
c = -1; ←コンパイルエラー
c = (char)-1; ←コンパイルエラーにはならないが65535になる

QJAVAでソケット通信(クライアント)の際のbind方法

JAVA初心者です。
アクセス元のIPアドレスで認証をしているサイトがあり、
httpアクセスでそこから定期的に情報を取ってくるようなものを
JAVAで作っています。
対象サイトは複数あり、それぞれに許可されているIPアドレスは別になるため、socketを使い、IPアドレスをbindしたいのですがうまくいきません。

~~前略~~
Socket socket = new Socket(Host, 80);
bind(socket,"IPアドレス");
~~後略~~

もしくは
~~前略~~
Socket socket = new Socket();
bind(socket,"IPアドレス");
~~後略~~

など、いずれもうまくいきません。なお、クライアントマシンには使用するIPアドレスは全て定義済みです。
また、アクセス元(JAVAが動くPC)のIPアドレスを指定せず
デフォルトのままでアクセスする事自体は
~~前略~~
// Hostの内容はyahoo.co.jp等特にアクセスの制限の無いサイトのもの
Socket socket = new Socket(Host, 80);
~~後略~~
とすることで接続出来ました。

皆さんの知恵を貸していただければと思います。
アドバイスよろしくお願いいたします。

JAVA初心者です。
アクセス元のIPアドレスで認証をしているサイトがあり、
httpアクセスでそこから定期的に情報を取ってくるようなものを
JAVAで作っています。
対象サイトは複数あり、それぞれに許可されているIPアドレスは別になるため、socketを使い、IPアドレスをbindしたいのですがうまくいきません。

~~前略~~
Socket socket = new Socket(Host, 80);
bind(socket,"IPアドレス");
~~後略~~

もしくは
~~前略~~
Socket socket = new Socket();
bind(socket,"IPアドレス");
~~...続きを読む

Aベストアンサー

> ~~処理~~
ここがどうなっているのか分からないので、何とも言えないのですが、
単にBind、Connectするだけなら以下の通りです。

//ホスト名(xxxx)、ポート番号(yy)からアドレスを作る
InetAddress a = InetAddress.getByName("xxxx");
InetSocketAddress b = new InetSocketAddress(a, yy);
//ソケットを作る
Socket s = new Socket();
s.bind(b);  //Bindの例
s.connect(b); //Connectの例

Qjava socketエラーについて

javaでソケット接続するプログラムを作成しています。ソケット接続の以下のエラーがたまに発生するのですが、このエラーが出た際、回避方法がわかりません。どのようにしたら再度ソケット接続を行なえるのでしょうか?

以下エラー内容です。


java.net.ConnectException: failed to connect to /192.168.10.12 (port 50000): connect failed: ENOBUFS (No buffer space available)

お詳しい方、よろしくお願いします!

Aベストアンサー

コネクション確立のためのシステムリソース(バッファ)が足りませんというエラーだと思いますが、アプリケーションの中でSoketをopenしっぱなしで放置しているといったことはないでしょうか?

Q違うクラスからの変数の共有化

一つのクラスの中にある変数の値を、二つの別なクラスから呼び出して、その二つのクラスのどちらから変数を参照しても同じ値が帰ってくるようにしたいのですが、いろいろ調べてもできなかったので質問させていただきますm(_ _)m

// 共有化させたい変数を持つクラス
// Var.java
public class Var{
 public static int i;

 public Var(int i){ this.i = i; }
 public Var(){}

 public static void getI(){
  return i;
 }
}

//クラス1
//Class1.java
public class Class1{
 Var var = new Var(1);
}

//クラス2
//Class2.java
public class Class2{
 Var var = new Var();

 System.out.println(var.getI());
}

とした場合、Class1を実行し、次にClass2を実行すると、クラス1で定義した変数の値である 1 が戻ってくるようにしたいのですが、上記の方法では、Class2を実行すると結果は 0 になってしまいました。
まだまだ習い始めたばかりでいまいちstaticを使い切れていないと思います・・・

たとえば、PrintStreamクラスの
public static final PrintStream out
というのはどこから参照しても同じ結果なのでそのようなやり方で大丈夫だろうと思ったのですが・・・

このような方法では共有化させることはできないのでしょうか?またできないのでしたらほかのやり方がもしあった場合は教えていただきたいと思います。
どうかお願いします。

一つのクラスの中にある変数の値を、二つの別なクラスから呼び出して、その二つのクラスのどちらから変数を参照しても同じ値が帰ってくるようにしたいのですが、いろいろ調べてもできなかったので質問させていただきますm(_ _)m

// 共有化させたい変数を持つクラス
// Var.java
public class Var{
 public static int i;

 public Var(int i){ this.i = i; }
 public Var(){}

 public static void getI(){
  return i;
 }
}

//クラス1
//Class1.java
public class Class1{
 Var var...続きを読む

Aベストアンサー

Class1 のインスタンス
Var var = new Var(1);
Class2 のインスタンス
Var var = new Var();
これは、それぞれ別物を指しています(だって、自分で new と書いて新しく生成しているじゃないですか!)。

Class1 で値を入れた static 領域を Class2 で参照するには、

public class Class2{
// Var は大文字(クラス名)
 System.out.println(Var.getI());
}

とします。「クラス名.staticメンバ」という書式です。ただし、共有されるためには同じ Java VM 上実行されることが条件です。

※参考
public Var(int i){ this.i = i; }
この書き方は実行はできますが、意味的には正しくありません。staticメンバ は new しないでアクセスされることが前提なので、
Var.setI(i);
Var.i = 1;
というような書き方が良いと思います(new はしません)。

Class1 のインスタンス
Var var = new Var(1);
Class2 のインスタンス
Var var = new Var();
これは、それぞれ別物を指しています(だって、自分で new と書いて新しく生成しているじゃないですか!)。

Class1 で値を入れた static 領域を Class2 で参照するには、

public class Class2{
// Var は大文字(クラス名)
 System.out.println(Var.getI());
}

とします。「クラス名.staticメンバ」という書式です。ただし、共有されるためには同じ Java VM 上実行されることが条件です。

※...続きを読む

QJAVA  ArrayListからArrayListへのコピー

java で、ArrayListからArrayListへコピーはできるのでしょうか?
clone()というメソッドがありましたが、よくわからず、コピーできてないようなので伺いました。

ベーシックではできるようですが、JAVAでもできるのでしょうか?
どなたか教えていただけませんでしょうか?

Aベストアンサー

ArrayList li = new ArrayList(list);
でよいでのでは?


人気Q&Aランキング