★★Java質問・相談スレッド181★★
■ このスレッドは過去ログ倉庫に格納されています
プログラミング言語Javaに関する質問スレです。
JavaScript, Ajaxの質問は、ここでは受け付けていません。
Web製作管理 http://pc11.2ch.net/hp/
Webプログラミング http://pc11.2ch.net/php/
をご利用下さい。
よくある質問
・「コマンドまたはファイル名が違います」
「'javac' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。」
「Exception in thread "main" java.lang.NoClassDefFoundError: 」
(p)ttp://www.wikiroom.com/java/?path,classpath
・「\12288 は不正な文字です。」
文字リテラル以外で全角スペースは使えません。半角スペースに。
・その他の質問→「APIのjavadoc見ろ」
・String に == は使うな。equals() を使え。※
質問時の心得
・コンパイルエラーか実行時エラーか、エラーではないが意図しない動作なのかはっきりしろ。あとエラーメッセージちゃんと読め。
・前提条件としてOS、開発環境、バージョン、使用フレームワーク等を明記。
前スレ
★★Java質問・相談スレッド180★★
https://mevius.5ch.net/test/read.cgi/tech/1492780397/ on error goto みたいなの無いの? そのルーチン内ならどこでエラー発生してエラー処理に向かう、みたいな
それともtrycatchに全部入れちゃう? >>206
JavaとJavaScriptは全く別のものだ。 >>208
そう。
それかメソッドに throws Exception 付けておくかかな。するとそのメソッド内で例外発生すると呼び出し側に帰って例外処理になる。 On Error Gotoはtry catchで代用できるけど
On Error Goto + Resume Nextの代用がないだよね
1ステートメントごとにtry catch書かにゃならん >>204
そんなもんは知らん。機種によってマウントされるディレクトリは違うのでは? >>204
Androidのジャヴァモドキは正規のライセンスを受けていない違法な海賊版なんだよ
JavaスレでAndroidの質問をするのはバカが違法ダウンロードを自慢するようなもの >>214
JavaVMって独自に作っちゃいけないんだっけ? >>217
オラクルさんによると特許侵害と著作権侵害 >>218
同じ動きをする全く別のプログラムは著作権の問題はないよな?もしこれにあったら OpenJDK もあり得ないわけだし。
特許はどこにあるのか?それとその特許は OpenJDK の方では避けられているのか? >>219
避けられてないよ
あくまで「OracleがリリースしたOpenJDK」に対して特許の利用が認められている
OpenJDKを勝手に弄って配布したら特許侵害 プログラミングではないのですが教えて下さい。
Androidのアプリで、
マップルという地図ソフトがあります。
起動後、地図データへのパスを求められます。
大容量の地図データなのでSDカードへ入れます。
と、そのパスの形式が
/storage/47D2-1300
みたいな感じで、
SDカード固有の数字で、「数字4桁-数字4桁」のディレクトリを調べないといけないのです。
「数字4桁-数字4桁」を調べるにはどうすればいいのでしょうか? ↑、失礼、間違えた。
Androidスレで改めて質問し直します。
>>212-214
どうもでした。 すいません jar の作り方がよくわからないので教えてください
packege util の Util.class が
util/uti.jar にはいっていて
それを使っているメインプログラムがパッケージなしで
main / Main.java
にあるんですがダブルクリックするだけで動く jar を作るにはどうしたらいいんでしょうか >>219
そうなのか?
OpenJDKはGPLだろ?
GPLに従う限り二次派生の作成も配布も問題ないはずだ
OpenJDKというJava実装はオープンで公開していながら
Googleに対してはJavaのAPIはOracleの著作だからお金払ってね♡
ってわけがわからないよ >>224
ぐぐっていろいろ変えてみてるんですけどうまくいかないんです
作ったフォルダの中でダブルクリックすると動くんですが
他のフォルダにうつすと動かなくなって
メインクラスがロードできないっていわれます
jarの作り方の記事自体はたくさんでてくるんですが
他のjarに依存する場合の書き方があまりでてこなくて
MANIFESTにクラスパスをかけばうまくいきそうなのにかいてもうまくいかなくて困ってます >>224 ググれクスに見えるな。やっぱ、ググレカスの場合は小文字じゃないとな。 >>227
MANIFESTの仕様見たか、素人には無理かもね >>221
ファイルマネージャとかでSDカード内を確認してフルパス取得すれば済む話じゃないの? >>220
あれは GPL だけど特許はそのままのものなのか? >>220
ひょっとしてGPL知らんのか?
改編不可なんてポリシー上あり得ないんだが w 訴訟についてはこれか。
OracleとGoogleのJava著作権侵犯裁判の現状を知る(2018年版)
http://www.orangeitems.com/entry/2018/03/28/173616 >>232
GPLv2はあくまで著作権の利用許諾でしかなく、特許の利用について何も保証しない。
GPLソフトウェアを使った者を特許侵害で訴えることは普通に可能。
その問題を解決することを意図して特許までカバーしたGPLv3ができたんだけど、OpenJDKは残念ながらv2だ。
理由はもちろんそういうこと。 お願いします どなたか助けてください 課題の提出期限がすぎそうです;;
原因きりわけのために使ってるjarと同じ階層構造の
以下のような最小セット構成でコンパイルしてるんですがjarにすると動きません
a/A.class (packege a)
b/B.class (パッケージなし) ソースをみると import a.* を使ってる
Main.java 今回つくったプログラムでパッケージ宣言なし B を使用
> javac -cp .;b Main.java でコンパイルは通る
> java -cp .;b Main → 動く
---MANIFEST.MF---
Manifest-Version: 1.0
Class-Path: . b
Created-By: 1.8.0 (Oracle Corporation)
Main-Class: Main
> jar cvmf META-INF/MANIFEST.MF main.jar *.class a b でjarを作成
> java -jar main.jar でも > java -cp .;b -jar main.jar でも
Exception in thread "main" java.lang.NoClassDefFoundError: B
というエラーが出ます
クラスファイルの状態だと動くのにjarにすると動かない原因がどうしても分かりません
MANIFESTをかくのがはじめてなので根本的に何か間違ってる気もするんですが
Class-Path の書き方は何度もぐぐってスペースあけて並べるとあったんですがためしに .;b にしてもダメでした
解凍する前にb.jarをクラスパスで指定してたときは同じフォルダ内であれば動いたことがあったのですが
今は同じフォルダ内でも動きません
http://fast-uploader.com/file/7084024397219/
最小セットにしたファイル一式です 「java exception in thread main java.lang.noclassdeffounderror」で検索!
一言一句正確なエラーメッセージで検索するのが、基本! >>236
もう何か芋検索しているんですが原因はパスとおってないってことしかでてこないです
実際そうなんだと思うんですがjarを作るのがはじめてで何が足りないのかがさっぱりわかりません
MANIFESTにかくのと 実行時 cp オプションをかく意外に何か必要なんでしょうか
あるいは指定の書き方が間違っているのでしょうか
スペルミスなんかは何度も確認しているんですが…
もう課題の提出期限すぎちゃったのでわかりませんでしたってかいてレポートかいちゃいましたが
今後のためにも知っておきたいなと >>234
>GPLソフトウェアを使った者を特許侵害
GPL は「特許」ではなく著作権の方だと思うのですが >>238
そうだよ
だから著作権の使用はGPLに従うことで許諾されるけど特許は関係ない >>235
Class-Path の所の b を b/ にするとどうなる? >>240
同じフォルダ内であれば動くようになりました
最後に / つけるだけでかわるんですね
ただやはり別のフォルダにうつすとスタンドアロンでは動かないみたいです
ためしにクラスを消去してみるとアーカイブに入ってるはずなのに同じフォルダでも動かなくなります
>javac -cp .;b Main.java
>jar cvmf META-INF\MANIFEST.MF main.jar *.java *.class a\*.java a\*.class b\*.class b\*.java
マニフェストが追加されました
Main.javaを追加中です(入=83)(出=72)(13%収縮されました)
Main.classを追加中です(入=281)(出=214)(23%収縮されました)
a/A.javaを追加中です(入=106)(出=95)(10%収縮されました)
a/A.classを追加中です(入=381)(出=272)(28%収縮されました)
b/B.classを追加中です(入=249)(出=191)(23%収縮されました)
b/B.javaを追加中です(入=79)(出=68)(13%収縮されました)
>java -jar main.jar
Hello World
>del *.class a\*.class b\*.class
>java -jar main.jar
Exception in thread "main" java.lang.NoClassDefFoundError: B
at Main.main(Main.java:3)
http://fast-uploader.com/file/7084045860348/ (パス jartest) >>241
なるほど、そうすると
MANIFEST.MFのClass-Pathはjar内のパスを指定するものではなくて
jarの外のパスを指定するものだってことになるかと
jar内のパスはあくまでもpackageでやりましょうということなんじゃないかな packageはディレクトリで示されるのでデフォルトパッケージのB.classが
b/の下にあるのがおかしいのでしょうね >>242,243
わああ うごきました!!!!!
パッケージがついてないソースを全部同じフォルダに展開しただけで動くようになりました
コンパイルにパスの指定も必要なくなったし
パッケージ構成とフォルダ構成をあわせる必要があったんですね
課題用に配られたソースだったので自分で描いたコードと分けておいた方がいいのかなと思ったんですが
そのせいでまる1日どはまりしてしまった
教えていただいてありがとうございました
ほんとに助かりました クラスパスに指定するjarの扱いはディレクトリのようなもんなんだよ。
main.jar内にb/B.classが入っていて、デフォルトパッケージのBってクラスを
使いたいんだったら、kラスパスは main.jar:b (正確な書き方は忘れた)
みたいに書かないとダメなんだよ。 >パッケージ構成とフォルダ構成をあわせる必要があったんですね
入門書にも書いてあるのに、説明書を読まずにやっているから出来ない。
プログラミングのほとんどは、説明書を読むかどうかだけ
読まない人は、出来ない
学校の勉強と同じ。
教科書を読まない人は、出来ない まだ学生なのでそんなに本にお金かけたりできないんですけど
もしお勧めの本があったら紹介していただけませんか?
パッケージを作るときにフォルダ構成をあわせるのは知ってましたが
a/A.java の構成はそうなってる
他の人が作ったパッケージ宣言されてないソースを使うときに
トップディレクトリに展開しないとjarにはできないとは思わなかったので…
ディレクトリとパッケージを合わせることが自然なことは本にかかれてるかもしれませんが
他に方法がないというのはそう自明なことではないと思います 調べ方をしらねーだけなんだからカリカリすんなよ
本を読むだけでできるようになるんなら職業プログラマなんかいらねーんだよ >>247
俺はJavaは知らないのだけど、一般的な方法を。
> 課題用に配られたソースだったので自分で描いたコードと分けておいた方がいいのかなと思ったんですが
> そのせいでまる1日どはまりしてしまった
これは割とよくあるパターンで、
・環境の立ち上げは、基本的に 『かなり詳しくないと』 はまる
・環境ではまったら、初心者だけで復旧は不可能
だから、自分が初心者だと分かっているうちは、出来るだけ環境問題に遭遇しないようにするのが基本。
つまり、
・与えられたソースをその場で改変する
・元ソースと比較したい場合、元ソースを ***.org とかいう風にしてコピーしておく
(元環境と同じファイル名/ディレクトリ構造でコンパイル出来る状態で編集する
=元ソースはファイル名そのままで編集する。あくまでコピーを別名で持つ)
・インストール時にデフォのパスがあるのなら、つべこべ考えずそのままそこにインストールする
てな感じ。
俺は本を読む前に味見するのも良いことだと思うぜ。
そして上記の通り、地雷を避ける方法も知っておけばいいだけだ。 >>247
技術習得中はどれが問題解決に必要な情報なのかわからないんだからあまり気にしなくていい
むしろ問題解決に必要な情報が出せれてるから問題ない
最近はそれがなかなかできないやつが多いからなぁ
んで、お金がないから本を変えないつーことならちょい難易度高いが教科書+公式ドキュメント+サンプルっぽいソース探すのがおすすめ Java の定本は、
スッキリわかる Java入門 第2版、2014
基本はエラーメッセージで検索して、自分で調べること。
それでもわからないなら、ここで聞く >>251
マ板の35歳がそれ読んで荒らしに来るから紹介は控えて欲しい インスタンスの配列定義について教えてください
@とAはどう違うのでしょか?
(1行目のカッコの位置です)
@カッコが左のAnimalにある
Animal[] vc = new Animal[2];
vc[0] = new Animal();
vc[0].name = "neko";
vc[0].age = 5;
・・・・
Aカッコが左の変数にある
Animal vc[] = new Animal[2];
vc[0] = new Animal();
vc[0].name = "neko";
vc[0].age = 5;
・・・・
上記2つでコンパイルエラーになりません。
違いはなんですか? >>255
同じ
AはC言語に慣れた人のための書き方で、意味的には完全に間違っている
使った瞬間バカ認定されるから絶対に使ってはいけない
今すぐ忘れていい >>256
教授が使っていたので、びっくりしました。
ありがとうございました。 >>256
意味的に完全に間違ってる?
文法上許されてるし何の問題もないと思うが? >>258
例えばメソッド名の先頭が小文字でもコンパイルは通るから何の問題もないと考える人? >>259
ああ。文法上は問題なかろう。慣習には反するかも知れないが間違いではない。 >>258
Animal配列型の変数vcだから
Animal型の配列変数vcという書き方は良くないという話だよ
そもそも配列変数なんてものは存在しないからね
シンタックスシュガーでC風の書き方ができるだけ
この構文を積極的に使う理由なんてないよ var vc:Array<Animal>
Haxe では、
var 変数名:型 Javaでチャートを表示したくて
javafx.scene.chart.LineChart ってのをはじめて使ったんですけど
これアニメーションで使うにはどうすればいいんでしょうか
Scene scene = new Scene(lineChart,800,600);
stage.setScene(scene);
stage.show();
でグラフが表示されるんですが
そのあとで
try { Thread.sleep(2000); } catch(Exception e) {}
//データ更新
stage.show();
をやったところスリープ中に何も表示されず最後のデータだけが表示されます
あるいはJavaFXではなくawtパネルや
単にImageを生成するようなライブラリがあったら教えていただけると助かります >>267
意味がわからん。
なんでこれでアニメーションされると思ったのかと何がしたいのか具体的に説明してくれ。
> try { Thread.sleep(2000); } catch(Exception e) {}
> //データ更新
> stage.show(); >>268
気持ちはわかるだろ
なんでできないのかもったいぶらず教えてやれよ >>268
マイク入力をよんでスペクトルをリアルタイムで表示するようなのを作りたくて
while() {
// 音声ラインから一定サイズよみこみ
// フーリエ変換
// グラフ表示更新
}
みたいなプログラムをかいたんですがグラフがまったく変化しなくて
原因を追究して >>267 みたいなプログラム内でブロックするような処理があっても
それが終わるまでグラフが一切表示されないのが原因みたいです
スレッドをわけてみたりもしたんですけどよくわからないエラーが出たりでうまくいかなくて
JavaFXで検索もしてみたんですが表示して終わりばかりで表示更新を扱ってるブログも少なくて困ってました java8でメモリリークを強制的に発生させる良い方法ってありますか?
Webシステムでリークが発生している場合のヒープサイズの変化を
明示的に出したいです。 static ArrayList<byte[]> leak = new ArrayList<>();
while (true) leak.add(new byte[1000000]); リークっていうか、とにかくメモリ使ってどこかから参照されっぱなしになればいいだけだよな。 数スレ前にもJavaFXで画面更新したいって質問あったけどまともなレスついてなかったし
誰も使ってないんだろうなー
自分もサーバーサイドばっかりでGUIとか数年かいてないわ もうJavaFXはJavaの一部ではなく単なる野良ソフトウェアの一つだしな
初心者なら今からクライアントJavaに手を出すなんて時間の無駄だからやめた方がいい
煽りでも何でもなく、公式に完全に終わってる Javaの文法でwidowsライクなアプリ作れるから俺はSWT一択だね(キリッ >>270
わかった。
> try { Thread.sleep(2000); } catch(Exception e) {}
> //データ更新
> stage.show();
とは全然関係ないのな。
自分で言ってる以下のループの中身を...
>while() {
> // 音声ラインから一定サイズよみこみ
>// フーリエ変換
> // グラフ表示更新
>}
javafx.animationでやればいい。
これでも読んどけ。
ttps://docs.oracle.com/javase/jp/8/javafx/visual-effects-tutorial/animations.htm#JFXTE149
ttps://docs.oracle.com/javase/jp/8/javafx/user-interface-tutorial/bar-chart.htm
>>271
ファントム参照の中身をルートから辿れるところに
参照させればリークできるけど本当に開放する手段ないぞ。 >>281
リプありがとうございます
このtimelineの使い方がよくわからないんですけど
ブロックは音声読み込み側でやっちゃうので
timelineでディレイをかけるとリアルタイム性が確保できなくないですか?
timelineの中で音声読み込みをすればできなくはなさそうですけど
大幅にプログラムを書き換えないといけないし
処理と表示の分離もしにくくなると思うんですがそれしか方法はないんでしょうか
音声読み込みするスレッドから何かメソッドをよんで即時表示更新ってのはできないものなんでしょうか
while() {
// 音声ラインから一定サイズよみこみ
// フーリエ変換
// なにかメソッドをよべばグラフ表示更新
} >>287
Platform.runLater
でアプリケーションスレッドで処理を実行できるみたいっすよ >>288
わわわ 神様だー!
ありがとうございました!
ようやくやりたいことができましたー!
もうあきらめかけてたんですけど質問してよかったです 何度もすいません
void f(int[] a) {
for(i : a) {
double d = (double)i
同じ処理
}
}
void f(double[] a) {
for(d : a) {
同じ処理
}
}
みたいにintとdouble配列を受け取って同じ処理するだけの関数が必要なんですが
まとめて記述することってできないでしょうか
そこそこ速度が要求されるので最初にキャストした配列を作って渡すのも若干無駄だし
関数型言語風にかくなら
void f_core(<T>[] d, Function<<T>, double> cast) {
for(x : a) {
double d = cast.apply(x);
同じ処理
}
}
void f(int[] a) { f_core(a, x => (double)x); }
void f(double[] a) { f_core(a, x => x); }
みたいにかければいいんですけどJavaで任意型のメソッドって作ったりうけわたしたりってできますか? >>290
Number[] で受け取って doubleValue() で取り出す。
その代わりプリミティブ型の配列は渡せないが。 >>290
普通にその関数型風のコードのようにジェネリクスとラムダを使えばできるけど、
Javaのファッキンなんちゃってジェネリクスだと必ずボックス化が入るからクッソ遅くなるよ
NumberやObjectを使っても同様
諦めて別々のメソッドにして「同じ処理」の部分だけをメソッドに括り出して共通化しなさい >>291,292
やっぱりプリミティブ型のジェネリクスは無理なんですね
ありがとうございました だめだー
せっかく教えてもらったのに0.1秒で4000個のデータ描画表示すら間に合わない
AWTでdrawLineとか使って直書きなら8000ぐらいでも間に合うのに
JavaFX のチャートの設定で何か軽くなる設定とかってあったりしますか?
せっかく苦労したのにAWTに戻すことになりそう >>294
JavaFXの唯一の正しい使い方は、全面にWebViewを貼り付けてHTMLで全てを作ること。
誰も使ってないJavaFXなんかより遥かに速くて快適なUXを実現できる。D3.jsとか使えばチャートも簡単爆速美麗。
馬鹿馬鹿しいと思うならSpring Bootにでも乗り換えてJavaらしく普通にWebアプリにしよう。 >>295
ぜんぜん仕事とかじゃなく
いまvtuberはやってるじゃないですか
でも地声でやるの恥ずかしいからボイスチェンジャーつくりたいなーって完全に趣味です
>>297
学生あがりでJavaとCしかかけないです
ウェブアプリってサーバーがHPの表示する内容かえるみたいなかんじですよね
そもそもサーバーがない
まあ普通にAWTでGraphics.drawLineでCanvasに描画すれば間に合ったので
JavaFXのチャートあるならスケーリングやメモリの描画までやってくれて
見た目もきれいかなと思った程度なのでJavaFXのことは忘れます 皆、無料のRails チュートリアルをやってる。
サーバーなんて、Ruby のSinatra でも良いし
Rubyでも、Node.js, jQuery, Vue.js など、JavaScript(JS) は必須。
D3.js を使っても良いんじゃない?
VSCode だって、Electron だし、
Python のJupyter Notebook(IPython Notebook) だって、JSだろ
ほぼすべての言語で、画面には、JSを使う >>301
Rubyはオワコン
10年遅い
今のトレンドはJava いや、JavaはKotlinに食われつつある。Androidに関してはかなり征服された。 >>304
多分JavaとRUBYと
あべこべに書いてしもたんやろな 両方オワコンだから間違えようがない
一部の狂信的な信者以外は Nettyの質問なんだけど
https://netty.io/wiki/user-guide-for-4.x.html
俺の理解だと、サーバーは受信時にInbound、送信時にOutbound。
ところがこのサンプルのtimeserverhandlerはInboundHandlerでレスポンスをしているように見える。
そもそもサーバーのOutboundHandlerはどんな時に呼び出されるんだろうか?
クライアントはまずOutboundが呼ばれてレスポンスがあった場合のみInboundが呼ばれるのだろうと思う。
サーバーのOutboundは何をトリガーにするのか?レスポンスしない場合もあるだろう。
サーバーのOutboundHandlerのサンプルが見つからない。
このあたり分からないので誰か教えてください。 ■ このスレッドは過去ログ倉庫に格納されています