Java入門・初心者質問スレ Part.9

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2019/03/09(土) 23:59:15.92ID:ACok0wnJ
Java初心者のためのスレッドです。

※前スレ
Java入門・初心者質問スレ Part.8
http://mevius.5ch.net/test/read.cgi/tech/1528370228/
2019/12/28(土) 00:45:15.64ID:Nw+g0oHm
>>260
エクセル初級とか持ってる爺は可愛いかもしれない
2019/12/28(土) 00:51:07.95ID:Td7wq8Cw
プリミティブ型の変数の宣言と、インスタンスをnewする文だったら、
やはり前者を上に書くべきでしょうか?
2019/12/28(土) 01:28:06.39ID:b3ohKRMf
>>270
どういう順序で書けば読みやすくなるかを考えて決める
プリミティブだから先に書くべきって考え方はしない
2019/12/28(土) 02:16:55.89ID:Nw+g0oHm
超初心者です。宜しくお願いします
カッコに入るコードを選択する問題がありました

class Q27 {
public static void main ( String [ ] args )
int [ ] date = { 10,20,30,40,50 } ;
int sum = 0 ;
for ( int i = 0 ; 【ここにコードを挿入】; i ++ ) sum += date [ i ] ;
System . out . println ( sum / dara . length ) ;
}

解答
i < = date . length -1

解説で「変数 i は配列 date の添え字であるため、i の値が 0 からdate.length -1」まで変化するように条件式を設定すればよい」
との事ですが、いまいちわかっていません
申し訳ありませんが、どなたか解説お願いします。
273270
垢版 |
2019/12/28(土) 02:40:53.23ID:Td7wq8Cw
>>271
ありがとうございます

>>272
配列変数名がdateになってますが、dataの間違いですかね
日付は31日までですし…

配列dateの最後の要素(=5番目の要素)は、date[date.length]ではなく
date[date.length-1]となります(この場合はdate[4]が最後の要素となる)
添え字は0から始まるので最後の要素は要素数-1(=length-1)となる点に
お気を付け下さい
2019/12/28(土) 02:56:02.38ID:Nw+g0oHm
>>273
解説有難うございます
誤字脱字で申し訳ありません
「data」です。
添え字が0から始まるのは理解しております
問題で「 i++ 」と記入されているから「length-1」とするのでしょうか

お手数ですが宜しくお願いします
<m(__)m>
2019/12/28(土) 03:35:12.50ID:Td7wq8Cw
>>274
ごめんなさい、どこが分からないのかがいまいち伝わりませんでした…

i=0の時、data[0]=10
i=1の時、data[1]=20
i=2の時、data[2]=30
i=3の時、data[3]=40
i=4(=data.length-1)の時、data[4]=50
の全ての場合を足しこむ必要があるので、iは0からdata.length-1まで変化する必要が
あるのだと考えましたが
また明日以降質問して下さい
2019/12/28(土) 04:54:47.73ID:Nw+g0oHm
>>275
解説有難うございます。
添え字は0から始まる、とだけ理解してたのですが
詳しく書いて頂き出題の意味が分かりました。
私が出題の意味を理解してないんだと思います

本当に有難うございました。
2019/12/28(土) 05:53:14.15ID:Nw+g0oHm
何度も申し訳ありません
for文が苦手で理解できていません
for文の処理の順序を解説お願いします
左側の1から8は行数です

1 class Q27 {
2 public static void main ( String [ ] args ){
3 int [ ] data = { 10,20,30,40,50 } ;
4 int sum = 0 ;
5 for ( int i = 0 ; i <= data . length -1 ; i ++ ) sum += data [ i ] ;
6 System.out.println ( sum / data . length ) ;
7 }
8 }

ぱっと見の暗算で10+20+30+40+50=150を5で割るって考えてしまうんですが
自分の知能でコード解析すると
@3行目、int型の変数dataに要素10〜50を入れる
A4行目、in型のsumに0を代入
B5行目、for文、int型iに0を代入、iがdataより小さい間、回る。
ここまでしか分かりません
C5行目、0が代入されたsumにdata[0]の10、を足して代入
Dsum =0 に、data[0]=10を足して代入。sumは10
E6行目、10 割る data[0]の10 、なのでsumは0
Fdata[0]に入ってたiが5行目でインクリメントされi=1
Gi <= dataに戻り・・・1になったi よりdataが小さければ・・・

となり訳が分からなくなっています
大変お手数ですが、for文の回し方の順番をご教示願います
<m(__)m>
2019/12/28(土) 08:32:47.71ID:1iYlywTe
for文の前に、まだ配列についても理解があやしいな
@3行目はint型の変数dataではなく配列型の変数data
要素の型としてintを持つ配列だ
5個の値で初期化してるから、配列の長さは5になる
E6行目はdata[i]で割ったら分母10だけど、data.lengthで割ってるでしょ
lengthは配列の長さを表すから分母は5
つまり10/5=2で、まず2が出力される
ちなみに分母が10だったとしても10/10はゼロじゃないだろ落ち着け
「sumは0」という表現もあやしい
ここではsum / data.lengthの値をprintlnメソッドの引数に渡しているだけで、sumには代入してないからsumの値は変わらない
2019/12/28(土) 08:38:10.11ID:vGmL5pRR
>>277
ツッコミどころは色々ありますけど、5,6行に関しては分かりやすく書くと

for (int i = 0; i <= data.length - 1; i++)
  sum += data[i];
System.out.println(sum / data.length);

と書かれていて、これは

for (int i = 0; i <= data.length - 1; i++) {
  sum += data[i];
}
System.out.println(sum / data.length);

と同じです。つまりSystem.out.println()の行はループの外です。
2019/12/28(土) 08:42:36.18ID:1iYlywTe
B5行目、for文、「iがdataより小さい」というのが間違い
それをいうならi <= dataだろ
i <= data.length -1と書いてあるんだからlengthを無視してはいかん
「iがdataの長さより小さい」が正しい
data.lengthはさっきの説明通り5だから簡単に書き直すと
for (int i= 0; i <= 4; i = i + 1)
となる
2019/12/28(土) 08:46:52.36ID:1iYlywTe
ああ、ループの外だから2は出力されないか…
2019/12/28(土) 09:01:25.56ID:1iYlywTe
for (int i = 0; i <= 4; i = i + 1) {
//何か
}
なら理解しやすいはず
forの構文の意味は
for (ループの最初だけ実行する初期化処理; 継続するかどうかの判定; 1周ごとに行われる処理)

まずintの初期値が0になる
次に0<=4を評価して、成立するから「//何か」を実行
forに戻ってきてiをインクリメントしてiは1になる
こんどは1<=4を評価して、2回目の「//何か」を実行
iをインクリメントして2になる
2<=4も成立するから実行
中略
5<=4まで行ったら成立しなくなるので、ループを抜ける
結局「//何か」は5回実行されて終わり
2019/12/28(土) 14:26:04.86ID:Nw+g0oHm
有難うございます

「実行結果として30を表示するようにしたい」との問題です

@3行目、intの配列型が変数data、箱が5個
A4行目、intのsumに0を代入
B5行目、iに0を代入、iがdate.lemgthの長さより小さければfor文で回る
C5行目、data[i]=10、にsumを代入。sum=10
D6行目、sum=10 割る lengthの配列の長さ=5、なので【2】
Eforに戻ってきてiをインクリメントしてiは1になる
F今度は1<=4を評価して、2回目の「//何か」を実行
Giをインクリメントして2になる
H2<=4も成立するから実行
Idata[2]=20、sum+=20
J20/5=【4】
中略
K30/5=【6】
L40/5=【8】
M50/5=【10】
【】の中の合計=30

曖昧な点
「i=1の時、data[0]=10」だと数が合わないので
iを0にするために、data.length-1として
「i=0の時、data[0]=10」としている

Q1:この5回回った【】の中の合計は何処で足し算されてるのでしょうか
2019/12/28(土) 14:58:29.40ID:Nw+g0oHm
処理の順序が正しいかご教示願います

次にプログラムをコンパイル及び実行した結果として正しいものはどれか
1 class Q23 {
2 public static void main (String [ ] args ) {
3 int i = 1 , sum = 0 ;
4 while ( i ++ < = 10 ) sum + = i ;
5 System . out .print ( sum ) ;
6 }

解答、66が表示される

@intのiに1が代入
Asumは0が代入
Bwhileは〜の間
Ci=1が10より小さい間
Di=1に++、i=2
sum=0 += i=2、sum=【2】
Ei=2、
Fi=2が10より小さい間
Gi=2に++、i=3
sum=2 += i=3、sum=【5】
中略
Hsum=11 になったら終わり
sumにはiの2,3,4,5,6,7,8,9,10,11が加算され【65】になる
2019/12/28(土) 16:16:21.77ID:vGmL5pRR
>>284
合っていますが、

> 解答、66が表示される
ではなく「解答、65が表示される」、

> Hsum=11 になったら終わり
は 「i = 11 になったら終わり」ですね。

細かい部分をいい加減にするとあなたの理解の妨げになりますし、
読む方も書き間違えただけなのか理解できてないのか分かりにくくて面倒です。
2019/12/28(土) 16:28:31.89ID:vGmL5pRR
>>283
>>277のプログラムでfor文で繰り返し実行されるのは5行目の
sum += data[i];
部分(とi++)だけです。
ここでint配列に格納されているすべての要素を順にsumに足し合わせています。
sum = sum + data[0]; // i=0の時
sum = sum + data[1];
sum = sum + data[2];
sum = sum + data[3];
sum = sum + data[4]; // i=4の時

結果、forループ終了時点でsumは150 (= 10 + 20 + 30 + 40 + 50)で、
System.out.println(150 / 5) の結果(5はdata.length)、30が表示されます。
それだけのことです。
2019/12/28(土) 16:33:47.11ID:Nw+g0oHm
Javaの問題集でありました。なぜ10行目でコンパイルエラーになるのが理解できていません
for(;;)のカッコの中の;;が無限ループ?になるからでしょうか

public class p28Q26 {
public static void main(String[] args) {
int i=0;
for (;;) {
if(i >= 5)
i=0;
else
i++;
}
System.out.print(i);
}
}
2019/12/28(土) 16:36:30.25ID:Nw+g0oHm
>>285
解説有難うございます
「解答65が表示される」が正しいです。
誤字脱字申し訳ありません
2019/12/28(土) 16:47:11.07ID:Nw+g0oHm
>>286
解説有難うございます
5行目、for ( int i = 0 ; i <= data . length -1 ; i ++ ) sum += data [ i ] ;
ここで、sumに加算されていくんですね
見てたつもりで見てなかったです。

親切に解説して下さり本当に有難うございます
290デフォルトの名無しさん
垢版 |
2019/12/28(土) 18:17:08.70ID:p8R0Q+BH
>>287
システムアウトの構文がメソッド内ではなく、クラスに書かれているから。
291デフォルトの名無しさん
垢版 |
2019/12/28(土) 18:18:22.25ID:p8R0Q+BH
>>290
間違った。わからんな。
2019/12/28(土) 18:22:25.71ID:Nw+g0oHm
なぜ解答がfalseになるのかが分かりません

次のプログラムを粉ピル及び実行した結果として正しいものはどれか
1 public static void main(String[] args) {
2 int count = 3;
3 int limit = 2;
4 System.out.println(count <= limit);
5 }

解答:コンパイル及び実行されfalseが表示される

質問1:
eclipsでコード入力し実行すると4と表示されました
奇数はtureで偶数はfalse等の決まりがあるのでしょうか
質問2:
System.out.println(3 <= 2);
3が2よりも小さいなら・・・「小さいのでture」と考えてしまいました
何を基準にtureでfolseなのか理解できてません

何度も教えてクレクレで申し訳ありません。
宜しくお願いいたします
<m(__)m>
2019/12/28(土) 18:29:17.74ID:Nw+g0oHm
>>291
有難うございます。

解説では
「4行目から9行目のforループからぬけることがないため、10行目に制御が移ることが出来ない
そのため、コンパイル時に10行目でコンパイルエラーとなる」
と記載されております。
以前、聞いた話では
例えば
for ( int i = 0 ; i < 10 ; i++ ) {
のiのことをループ変数と呼ぶので、そこに「 ; 」を入れるとループすると聞いた覚えがあります
2019/12/28(土) 18:30:24.52ID:Nw+g0oHm
>>292
誤字脱字すみません
「粉ピル」でなく「コンパイル」です
誤⇒次のプログラムを粉ピル及び実行した結果として正しいものはどれか
正⇒次のプログラムをコンパイル及び実行した結果として正しいものはどれか
295デフォルトの名無しさん
垢版 |
2019/12/28(土) 18:40:26.94ID:p8R0Q+BH
>>292
少なくとも奇数、偶数という概念はない。
2019/12/28(土) 18:47:52.83ID:Nw+g0oHm
記号の意味を教えて下さい

int left = 12;
int rigth = 34
system.out.println(left > rigth ? left - rigth : rigth - left );

この「 ? 」と「 : 」はなんの記号なのでしょうか
2019/12/28(土) 18:49:18.19ID:Nw+g0oHm
>>295
有難うございます。
エクセル出来る人が昔、言ってたような気がしたのですが勘違いですね
親切に有難うございます
<m(__)m>
2019/12/28(土) 19:08:40.59ID:wFzdDG/T
>>296
A ? B : C
AならB、違えばC
大きい方から小さい方を引く処理をしてる
2019/12/28(土) 19:14:16.39ID:Nw+g0oHm
>>298
解説有難うございます

処理方法は
@left > raiget
Aleft - rigth = 12 - 34 = -22
Brigth - left = 34 - -22 = 22
2019/12/28(土) 19:20:59.18ID:Nw+g0oHm
>>298
アドバイスして頂いた後に問題集の解説を読み返して分かりました

「条件演算子を使った式である。条件式、left > rigth 、が成り立つ場合に、 left - rigth :が
そうでない場合はrigth - left 、が結果となる」

本当に有難うございます
<m(__)m>
301デフォルトの名無しさん
垢版 |
2019/12/28(土) 19:31:28.91ID:un29Kqgd
いきなり問題集で勉強しているのが不思議
2019/12/28(土) 19:38:00.99ID:Nw+g0oHm
>>301
「スッキリわかる」は読みましたが
無限ループの「 ; 」や、「left > rigth ? left - rigth : rigth - left」は乗ってなかったです
あまりも理解力がなさすぎて困りもんです
for文が苦手です。
2019/12/28(土) 22:12:24.13ID:/9L9K2QS
誤字脱字が多いとか、半角全角が混ざってるとか、不要なスペースが入ってたり必要なスペースが無かったりとか、プログラマとして致命的な欠陥
意識して直したほうがいいと思うよ
304デフォルトの名無しさん
垢版 |
2019/12/28(土) 23:30:03.54ID:un29Kqgd
>>302
あなたが質問していることは資格を取るための知識であって、Javaプログラマに必要な知識ではない。
2019/12/29(日) 00:42:02.66ID:siL0YjcS
誤字脱字多いですね。申し訳ありません
音声再生リストに入れたりして学習してる関係で不要なスペースを入れたりしてました。

どの程度知識あるか把握するのに資格は必要かと思ってました。
解説して下さった方には本当に感謝です
有難うございます。
2019/12/29(日) 08:46:31.43
プログラ魔
2019/12/29(日) 13:50:30.21ID:KIjz0jVz
あなうめ式Javaプログラミング超入門、2019/12/3
大津 真、田中 賢一郎、馬場 貴之

こういう本が出てるのだろ

大津真は、多言語の本を書いてる著者。
日経Linux のライターでもあるのか?
2019/12/29(日) 15:49:06.27ID:v8cZXQkF
eclipse で書けば、最低限の文法ミスは取れると思うのだが
それをやる気はないんですか?
2019/12/29(日) 16:13:51.10ID:siL0YjcS
>>308
「スッキリわかる」や問題集を音声変換ソフトに入力して日々聞いています
eclipsに書いても、音声変換ソフトではスペース多く入れないと変な英語になったりするので
音声変換ソフトに入力しています
310デフォルトの名無しさん
垢版 |
2019/12/29(日) 18:36:48.23ID:oAHsONBK
>>309
エクリップス?
311デフォルトの名無しさん
垢版 |
2019/12/29(日) 18:38:36.04ID:oAHsONBK
文系みたいな勉強法だなw
2019/12/29(日) 18:51:03.48ID:v8cZXQkF
実際に動かしてみないのか!
畳の上の水練だな
プログラムは動いてなんぼなので
必ず動かしてみることを強くお勧めする
動かないプログラムは何の意味もない
2019/12/29(日) 19:54:32.63ID:siL0YjcS
>>312
アドバイス有難うございます
実際に入力しても理解できないものがあり質問していました。

例えば
public class q18{
 public static void main(String[] args) {
  int count = 3;
  int limit = 2;
 System.out.println(count <= limit);
 }
}
実行結果は「4」と出ますが
問題集の解答は「コンパイル及び実行されfalseが表示される」との事です
エクセルの関数で奇数偶数表示でfalseやtureと判断する場合があるので
Javaでもあるのか?等、質問してましたが未だに判明していないです
2019/12/29(日) 19:56:46.80ID:f7fle0nG
10進法でシフトさせる方法って無いですか?
例えば1234→12、とかってやりたいんですが…
2019/12/29(日) 19:59:13.49ID:yqbBnK7b
>>314
10 で割るのが適当かと
316デフォルトの名無しさん
垢版 |
2019/12/29(日) 20:40:13.14ID:2ZGuf6bc
>>313
4と出るわけがないから実行するもの間違えてるよ
317デフォルトの名無しさん
垢版 |
2019/12/29(日) 20:42:12.56ID:2ZGuf6bc
https://paiza.io/projects/FhYUXk-mGxVmUKEaiXt5vw
2019/12/29(日) 21:12:21.70ID:Zt6NZoPC
>>314
10のn乗で割る
2桁シフトさせたいなら10の2乗の100で割る
ビット演算のシフトも意味としては同じ
2019/12/29(日) 21:55:22.43ID:siL0YjcS
>>316
有難うございます。
申し訳ありません。4じゃなくて「2」でした。
以下で実行すると2と表示されます

package Study;
public class Stady03 {
public static void main(String[] args) {

int count = 3;
int limit = 2;
System.out.println(count <= limit);
}
}
2019/12/29(日) 22:07:40.40ID:siL0YjcS
>>316
有難うございます
試しに「hello java」と入力しても「2」と表示されてました。
「false」と表示出来ました。
本当に有難うございます
321314
垢版 |
2019/12/29(日) 22:50:01.82ID:f7fle0nG
>>315
>>318
ありがとうございました
2019/12/29(日) 23:11:51.07ID:XnQ2dClW
ああ、別のプログラムを動かしていて、想定外の出力がされていたということか
2019/12/30(月) 00:06:41.49ID:4HDF+aJA
>>322
実行する時に「Javaアプリケーション」でなく「実行の構成」から実行してました
左側でクラスを選択せず実行しなかったので、前に選択してたクラスを実行させてました。
>>316 さんがアドバイスしてくれなかったら永遠に謎めいていました
本当に有難うございます。
エクリプスの操作方法の本も購入して頑張ります。
2019/12/30(月) 00:14:07.46ID:4HDF+aJA
>>317
わざわざ書いて頂きありがとうございます
こういうのもあるんですね。
本当に有難うございます。
325デフォルトの名無しさん
垢版 |
2019/12/30(月) 00:16:12.10ID:GxL7rxBL
Java全く知らない状態から約2週間でbronze合格出来て嬉しい!
シルバーまでは取ってほしいと会社に言われてるので紫本で勉強を始めたのですが
二次元配列とクラス名@ハッシュコードが出力される問題の理解が足りない・・・
何故ハッシュコードが出てくるのか・・・
2019/12/30(月) 01:38:30.44ID:4HDF+aJA
>>325
凄い!2週間で合格!!!
2019/12/30(月) 01:42:01.35ID:4HDF+aJA
>>325
前に他の言語とかの知識はありましたか?
328デフォルトの名無しさん
垢版 |
2019/12/30(月) 12:31:29.28ID:GxL7rxBL
>>327
二ヵ月程Python触ってwin用のguiアプリ作ってみた位です
オブジェクト指向使わずに作ったので今見ると糞コードですが・・・
スッキリわかるjava軽く読みながらコード書いて後は白本と黒本やってれば大丈夫だと思いますよ
2019/12/30(月) 12:59:36.01ID:QHPQM7tO
>>325
配列の要素を順番に探すと時間がかかってしょうがないからだよ
二次元配列を使うぐらいなら RDB を使うのが一般的だとは思うけど
2019/12/30(月) 13:21:39.21ID:yKHaMa8w
>>325
ハッシュコードが出るのはtoStringがオーバーライドされていないからというシンプルな理由
ObjectのtoStringがそのように実装されているから、すげ替えないことには同じ結果になる
どう書くとオーバーライドが成立するのか、しないのか、という話はそこそこ難しいかもしれない
331デフォルトの名無しさん
垢版 |
2019/12/30(月) 14:54:51.70ID:GxL7rxBL
>>330
アドバイスありがとうございます。
実際に書きながら確認していって理解していこうと思います。
2019/12/30(月) 18:24:06.08ID:4HDF+aJA
>>328
有難うございます
私も頑張ります
2019/12/30(月) 22:39:10.96ID:4HDF+aJA
解説してくれ方のお陰で、過去問したら89点取れました。
本当に有難うございます。
<m(__)m>
100点を連続5回取れるよう頑張ります
今後とも宜しくお願いします
2019/12/31(火) 05:48:01.42ID:tPXUyNvp
enum定数というのが出題されました。
「スッキリわかる」には載ってなくググってみましたが
理解力がないのでチンプンカンプンです
おススメの本とかサイトがあればご教示願います
<m(__)m>
2019/12/31(火) 13:36:43.87ID:9+YIWQbo
新しいインスタンスを生成できない

これに尽きるな
336デフォルトの名無しさん
垢版 |
2019/12/31(火) 13:57:18.91ID:yv9yhyfZ
>>334
柴田望洋の『新・明解Java入門 (明解シリーズ)』
僕は望洋さんの本で勉強したなー
2019/12/31(火) 14:15:06.32ID:uegmaB/s
昔読んだ初級本を理由があって探しています
最終まとめお題が「タイピング速度訓練ゲーム」(予約語をタイプして時間を計るもの)である初級本に心当たりのある方はおられますか?
2019/12/31(火) 20:40:43.65ID:tPXUyNvp
>>336
アドバイス有難うございます。
アマゾンで
柴田 望洋 「解きながら学ぶJava 入門編 (日本語) 単行本 ?」
購入しようか迷ってたとこです
2020/01/01(水) 03:30:56.24ID:yEYEASGU
>>336
アマゾンで
柴田 望洋 「解きながら学ぶJava 入門編 (日本語) 単行本 ?」
購入しました。
2020/01/03(金) 02:54:31.41ID:EbvJW/gM
問題集の解説が理解できてません
どなたか解説お願いします<m(__)m>

1 public class Q24 {
2 public static void main(String[] args) {
3 System.out.println(args[0]);
4 }
5 }

解説
コマンドライン引数に関する問題。コマンドライン引数を指定して実行した場合、
コマンドライン引数の数と同じ要素数の配列インスタンスが生成され、指定した文字列で初期化されます。
なお、コマンドライン引数を指定しない場合でも、必ず配列インスタンスは生成されます。
この場合は、要素数0の配列インスタンスが生成されます。
設問のコード3行目では、mainメソッドの仮引数で宣言しているString配列型変数argsの添え字0を指定し、
要素の値をコンソールに出力しています。コマンドライン引数を指定していない場合は、
String配列型変数argsは要素数0の配列インスタンスへの参照を保持します。
3行目で参照している添字0、つまり1つ目の要素は存在しません。
そのためこのプログラムは、コンパイルが成功しても、実行時に例外が発生します
2020/01/03(金) 03:00:04.97ID:RUwUdhzc
>>340
1コマンドライン引数に関する問題。コマンドライン引数を指定して実行した場合、
2コマンドライン引数の数と同じ要素数の配列インスタンスが生成され、指定した文字列で初期化されます。
3なお、コマンドライン引数を指定しない場合でも、必ず配列インスタンスは生成されます。
4この場合は、要素数0の配列インスタンスが生成されます。
5設問のコード3行目では、mainメソッドの仮引数で宣言しているString配列型変数argsの添え字0を指定し、
6要素の値をコンソールに出力しています。コマンドライン引数を指定していない場合は、
7String配列型変数argsは要素数0の配列インスタンスへの参照を保持します。
8 3行目で参照している添字0、つまり1つ目の要素は存在しません。
9そのためこのプログラムは、コンパイルが成功しても、実行時に例外が発生します

各行に番号を振りました。どの番号の行からわからなくなったのでしょうか?
2020/01/03(金) 04:08:56.51ID:EbvJW/gM
>>341
本当に有難うございます。
<m(__)m>
8行目から理解できていません。
「3行目で参照している添字0、つまり1つ目の要素は存在しません。」
これは、初期化されていないからエラーになるという意味なのでしょうか
以下のコードだと0が表示される事は理解できてます。
1 public static void main(String[] args) {
2 int [] score = new int [5];
3 System.out.println(score[0]);
  }
2020/01/03(金) 15:22:26.21ID:E3T+CFjv
CとC++を一通り教科書一冊やったところで、Javaにも手を出してみようと思うんだけど
1年くらい前にKotlinって言語が急上昇して、これがJavaの上位互換言語だみたいなことが言われてて、今からJavaやるのはありえない!みたいな意見を目にしたんだけど、実際その通りなの?
JavaもKotlinも全然分からなくて判断のしようがない
344デフォルトの名無しさん
垢版 |
2020/01/03(金) 15:44:39.59ID:O0mCvqHf
>>342
初期化の問題ではありません
配列の要素数の問題です

int [] score = new int [5];
System.out.println(score[0]);

これは要素数5の配列を作って添字0の値を出力するコードです

https://light.dotup.org/uploda/light.dotup.org628898.png

引数に何も指定しなかったら要素数0の配列が作られます
要素数が0のとき添字0は存在しないです
345デフォルトの名無しさん
垢版 |
2020/01/03(金) 17:46:51.19ID:+axZyF+3
>>343
上位互換ではなく寄生(悪い意味ではない)。
2020/01/03(金) 18:49:06.67ID:EAlgMQ2P
mainメソッド内で入力を受け付けて、誤入力があった時に終了させたいのですが、
その際にreturn;を使っていいでしょうか?
2020/01/03(金) 19:32:11.73ID:LNQstWl9
>>346
いいですよ。
でも終了コード(exit status)を指定したかったら
System.exit(int);
使うべし。
あと、そもそも意味が違うので、そのmainメソッドが他のメソッドから呼ばれる場合は
returnとSystem.exit()では動作が違うので注意ですけどね。
2020/01/03(金) 20:54:45.37ID:EbvJW/gM
>>344
有難うございます。
しかし
頭が混乱してきました
もう少しまとめます
349346
垢版 |
2020/01/03(金) 22:49:24.76ID:EAlgMQ2P
>>347
分かりました
ありがとうございました
2020/01/04(土) 02:21:07.91ID:X7t3Qsuc
>>340
Ruby の1-liner で、コマンドライン引数を、2つ渡した場合と、引数なしの場合

配列のサイズが0 の場合は、要素は存在しないため、アクセスできない。
Rubyでは、存在しない要素はnil となり、Java ではエラーになるのか?

ruby -e 'p ARGV.length, ARGV[ 0 ], ARGV[ 1 ]' あ a
#=> 2, "あ", "a"

ruby -e 'p ARGV.length, ARGV[ 0 ], ARGV[ 1 ]'
#=> 0, nil, nil
2020/01/04(土) 02:49:53.41ID:oEJCGEWJ
>>350
One-linerを1-linerと書くのはやめないか?
「漏れ」以外にその書き方するやついないぞ
2020/01/04(土) 11:13:28.17ID:TlPnzOfx
>>350
そのあたりは言語のデザイン(哲学)が違う。
Javaだと存在しない配列要素へのアクセスは例外が生じる。
ex.
System.out.println(new String[]{}[0]);
-> ArrayIndexOutOfBoundsException
2020/01/04(土) 11:43:36.84ID:9MTU5NN5
>>343
今のところKotlinはJavaが分かってる事が前提の言語。Kotlinからもやろうと思えばできるが。
2020/01/11(土) 19:17:40.16ID:KiFAjBY+
Random rand = new Random();
のように、インスタンス化の際に代入を行っている文の意味は分かるのですが、
そうでなく急にnew演算子から始まる、例えば
new Sample("samp"); // Sampleはクラス名
のような文はどう解釈すればよいでしょうか?
変数に格納されていないのですが…
2020/01/11(土) 19:37:45.27ID:qur7jyYe
>>354
作ったら放棄
作る処理だけ動く
356354
垢版 |
2020/01/11(土) 23:39:08.69ID:KiFAjBY+
>>355
ありがとうございます
ブロンズやシルバーの問題集でよく見かけるんですが、
どういう場合にメリットがあるんでしょうか?
2020/01/12(日) 00:28:23.36ID:FbSdnFnB
実用上のメリットはない
コンストラクタの挙動を学ぶための非日常的なコードだよ
英語の教科書を見てThis is a pen.と発言することにメリットはあるのでしょうかと真顔で問うような話だよ
2020/01/12(日) 00:41:02.43ID:FbSdnFnB
一応補足しておくと、コンストラクタを含めてメソッドには副作用がある場合がある
たとえばコンストラクタの中でデータベースの値を更新したりファイル出力を行ったりもできる
そういう副作用だけが必要な場合、こういう奇妙なコードを書いてしまうことはあり得る
359354
垢版 |
2020/01/12(日) 00:49:26.47ID:YGMc249+
>>357-358
そうなんですね
ありがとうございました
360デフォルトの名無しさん
垢版 |
2020/01/13(月) 15:57:25.19ID:UjYrXoaW
>>359
C++の影響。newはもともとメモリの動的確保を意味している。
2020/01/13(月) 17:02:16.87ID:30KNGumF
>>360
C++ ならば new したものは delete する作法を強要するべきで new して放置とかありえないのでは?
362デフォルトの名無しさん
垢版 |
2020/01/13(月) 18:16:10.00ID:PNIqRh18
ハンドルがないのに?
2020/01/13(月) 19:26:12.04ID:KUNSdwO3
噛み合わないコントみたいになってきたな
364デフォルトの名無しさん
垢版 |
2020/01/14(火) 17:31:35.16ID:65PQRowg
>>361
deleteをnewの前に書いとけばいいのでは?
2020/01/14(火) 22:11:59.04ID:n4wC7pc/
きったねーソースだなお前
2020/01/14(火) 23:39:48.82ID:s+tVLezo
汚い以前にだめだろ
2020/01/15(水) 17:40:41.68ID:8ggLLG+3
スッキリわかるJava入門実践編第2版を読んでいて疑問に思ったことがあります。

Comparableインターフェイス
Cloneableインターフェイス

という二つのインターフェイスがあります。

この二つのインターフェイスを実装するときの書き方ですが、
以下のように書くようです:

public class A implements Comparable<A> {

}

public class B implements Cloneable {

}

なぜ、Comparableには<A>という仮型引数を書くのに、Cloneableでは書かないのでしょうか?

Cloneableには実装すべきメソッドが1つもないから仮型引数を書く場所もないからでしょうか?
2020/01/15(水) 22:35:40.84ID:lrragII8
Comparabeが実装すべきメソッドcompareは引数として比較対象のオブジェクトをとる
その比較対象が自分自身と同じ型に限定されることを示すためにAが要る
Cloneableはメソッド自体がひとつもないマーカーインターフェースなので対照の例としては極端すぎる
Runnabeはrunメソッドがあるけど、runメソッドは型引数を必要としないので、Runnableも型引数を必要としない
369デフォルトの名無しさん
垢版 |
2020/01/25(土) 16:39:45.16ID:Z1ilCU6Y
bronze取ってから3週間更に勉強してsilver受かった!
落ちなくて良かった
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。