質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

3560閲覧

未入力時の出力方法がわかりません

tatatana

総合スコア2

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2021/04/14 05:20

編集2021/04/14 05:28

前提・実現したいこと

Javaでスコアを一覧で出せるシステムを練習で作っています。
コンパイラに打ち込むときに数字を入力してその結果を出したいです。

発生している問題・エラーメッセージ

java Main 1 x 3 y 5
のように配列5つで入力も5つの時は作動しますが、
java Main 1 x 3 y
のように未入力があってもメッセージを出すようにしたいのに、ArrayIndexOutOfBoundsExceptionが出て上手くいきません。nullの使い道がよくわかっていないせいだと思うのですが、何が間違っているのでしょうか。

該当のソースコード

public class Main {
public static void main(String[] args ){
String[] s = new String[5];
int i = 0;
if( args.equals(null) ){
System.out.println("スコアが入力されていません。");
}
while(i<5){
s[i] = args[i];
System.out.println("スコア:" + s[i]);
i++;
}
}
}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

K_3578

2021/04/14 05:21

行番号は消して、ソースコードはMarkDownの<code>ブロック内に貼り付けてください。
dodox86

2021/04/14 06:12

本筋の指摘ではないのですが、 > コンパイラに打ち込むときに数字を入力して コンパイラに打ち込んでいる訳ではありません。コンパイラとはjavac(Javaコンパイラ)のことであり、実行時のプログラムを指すものではありません。
K_3578

2021/04/14 06:43

>dodox86さん コンパイラについて勘違いしてるとその内絶対コケますね。
m.ts10806

2021/04/15 00:45

やりたいことと解決した方法が合致してない件、ご説明ください。
guest

回答3

0

ベストアンサー

javaは、いまいち不勉強ですが・・・lengthを使うとこんな感じです。

text

1usr ~/IdeaProjects/javaapp/out/production/javaapp % java Main 1 x 3 y 5 2スコア:1 3スコア:x 4スコア:3 5スコア:y 6スコア:5 7usr ~/IdeaProjects/javaapp/out/production/javaapp % java Main 1 x 3 y 8スコア:1 9スコア:x 10スコア:3 11スコア:y 12usr ~/IdeaProjects/javaapp/out/production/javaapp % java Main 13スコアが入力されていません。

java

1 public static void main(String[] args) { 2 int len = args.length; 3 // 4 if( len == 0 ){ 5 System.out.println("スコアが入力されていません。"); 6 return; 7 } 8 String[] s = new String[len]; 9 for (int i= 0; i < len; i++){ 10 s[i] = args[i]; 11 System.out.println("スコア:" + s[i]); 12 } 13 } 14

投稿2021/04/14 06:38

編集2021/04/14 14:32
cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/04/14 06:40

仕様次第ですね。 質問内容からすると「5つは必須」に見受けられます。
guest

0

1 x 3 yが入力された時は、String[] argsの配列の数自体が4個にしかなりません。
つまり、存在するのはargs[0]args[3]までの、4個です。
それなのに、while(i<5){ s[i] = args[i];として、args[4]にアクセスしようとするので、
配列の範囲外アクセスで落ちてしまうのです。

コマンドライン引数の配列の数は、自分が思った数ではなく、ユーザーが入力した数によって変化するため、決め打ちでいくつとしてしまってはいけません。
配列の数を知るためには、配列変数.lengthで知ることができます。

JAVA

1while(i<args.length){ 2 s[i] = args[i]; 3 System.out.println("スコア:" + s[i]); 4 i++; 5}

とすれば、とりあえず、引数の数だけ回すことができます。
ただしこの場合、引数が5つ以上あると、今度はs配列の方が範囲外違反になってしまうので、
条件を増やして、5回までにするか、s配列を作る際に、argsの数から作る等の工夫が必要になります。


表示が5回固定なのであれば、こうかな。

JAVA

1while(i<5){ 2 if(i<args.length){ 3 System.out.println("スコアが入力されていません。"); 4 }else{ 5 s[i] = args[i]; 6 System.out.println("スコア:" + s[i]); 7 } 8 i++; 9} 10

投稿2021/04/14 05:49

編集2021/04/14 11:43
amiya

総合スコア1218

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「5つ送られる」仕様にしたいならargsのlengthで判定できるのでは。
送られてないものは送られてないので参照できません。
「未入力」
ではなく
「無」
存在しないのです。nullですらありません。

最初に書いたlengthで判断するかArrayIndexOutOfBoundsExceptionを拾うか。

投稿2021/04/14 05:40

編集2021/04/14 05:40
m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問