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

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

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

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

Q&A

解決済

2回答

7206閲覧

配列の中身がnullだった場合にエラーメッセージをmainメソッドに返したい

Takuan2740

総合スコア23

Java

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

0グッド

0クリップ

投稿2019/08/11 14:53

前提・実現したいこと

配列がnullだった場合にIllegalArgumentExceptionのエラーメッセージをmainメソッドに投げて、「引数はNULLです。」と表示させたい。

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

本来配列の中身がnullだった場合には、「引数はNULLです。」とエラーメッセージを返したいが要素数が0の時に返されるエラーメッセージ「引数の要素数が不正です。」が返されてしまう。

java

1package com.ams.work210; 2 3public class Work210Test { 4 public static void main(String[] args) { 5 Work210 work210 = new Work210(); 6 System.out.println("[createRecordメソッド]"); 7 String[][] record = { { null }, {}, { "X" }, { "X", "X", "X", "X" }, { "X", "X", "X" }, 8 { "4903110006770", "毎朝のパン", "138" }, { "4903110006770", null, "138" }, 9 { "4903110006770", "毎朝の食パン", null } }; 10 11 for (int i = 0; i < record.length; i++) { 12 String eMessage = ""; 13 System.out.println("ケースNo" + (i + 1)); 14 15 for (int j = 0; j < record[i].length; j++) { 16 System.out.println("入力値:" + record[i][j]); 17 } 18 19 ProductBean productBean = new ProductBean(); 20 21 try { 22 productBean = work210.createRecord(record[i]); 23 } catch (IllegalArgumentException e) { 24 eMessage = e.getMessage(); 25 } 26 27 if (eMessage.length() != 0) { 28 System.out.println("結果:" + eMessage + "\n"); 29 } else { 30 System.out.println("結果:" + productBean + "\n"); 31 } 32 33 } 34 } 35} 36

java

1package com.ams.work210; 2 3import java.math.BigDecimal; 4 5public class Work210 { 6 7 public ProductBean createRecord(String[] record) throws IllegalArgumentException { 8 9 10 if (record == null) { 11 throw new IllegalArgumentException("引数がNULLです。"); 12 } 13 14 boolean hantei = record.length >= 4 || record.length == 0 || record.length < 3; 15 if (hantei == true) { 16 throw new IllegalArgumentException("引数の要素数が不正です。"); 17 } 18 19 try { 20 if (record[2] != null) { 21 Integer.parseInt(record[2]); 22 } 23 } catch (IllegalArgumentException e) { 24 throw new IllegalArgumentException("引数の第3要素が数値に変換できません"); 25 } 26 27 ProductBean productBean = new ProductBean(); 28 String code = record[0]; 29 String name = record[1]; 30 String keepPrice = record[2]; 31 32 if (record[2] == null) { 33 productBean.setCode(code); 34 productBean.setName(name); 35 productBean.setPrice(null); 36 37 return productBean; 38 39 } else { 40 BigDecimal price = new BigDecimal(keepPrice); 41 productBean.setCode(code); 42 productBean.setName(name); 43 productBean.setPrice(price); 44 45 return productBean; 46 } 47 48 } 49} 50

java

1package com.ams.work210; 2 3import java.math.BigDecimal; 4 5public class ProductBean { 6 private String code = ""; 7 private String name = ""; 8 private BigDecimal price = new BigDecimal(0); 9 10 public ProductBean() { 11 }; 12 13 public String getCode() { 14 return code; 15 } 16 17 public void setCode(String code) { 18 this.code = code; 19 } 20 21 public String getName() { 22 return name; 23 } 24 25 public void setName(String name) { 26 this.name = name; 27 } 28 29 public BigDecimal getPrice() { 30 return price; 31 } 32 33 public void setPrice(BigDecimal price) { 34 this.price = price; 35 } 36 37 @Override 38 public String toString() { 39 return "code=\"" + code + "\"\n" + "name=\"" + name + "\"\n" + "price=" + price; 40 } 41 42} 43

試したこと

条件式を"record[0] == null"のように変えてみたが、ArrayIndexOutOfBoundsExceptionエラーが返されてしまう。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/08/11 15:03

> productBean = work210.createRecord(record[i]); この行で渡してるrecord[i]は、コードを見る限り全て配列で、Nullは渡されてないです。 Nullを渡したときのコードをお願いします。
退会済みユーザー

退会済みユーザー

2019/08/11 15:04

配列サイズが0なのであって配列の中身が null ではありません。
guest

回答2

0

ベストアンサー

「配列の中身がnull」ということと「配列自体がnull」は意味が異なります。

java

1 if (record == null) { 2 throw new IllegalArgumentException("引数がNULLです。"); 3 }

この書き方は後者であることを判定するだけで、前者の判定はできません。
中身の判定をしたいのなら、要素を取り出して個別にnullかどうかを判定する必要があります。

投稿2019/08/11 15:45

swordone

総合スコア20651

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

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

Takuan2740

2019/08/11 16:01

個別に要素を取り出そうと思い、record[0],record[1],record[2]の要素を取り出しnullかどうかを判定しようとするとArrayIndexOutOfBoundsExceptionが返されてエラーになります。
swordone

2019/08/11 16:05

そこは要素数でループを回さないといけません。要素数も不定のようですので。
Takuan2740

2019/08/11 16:23

for文で回して要素数を取り出しnull判定をしたとろこ上手く判定でき、表示させたいエラーメッセージが表示されました。ありがとうございます。要素数が不定だった為エラーメッセージが出ていたと理解しました。
guest

0

String[][] record = { { null }, …

String[][] record = { null, …

にしては如何でしょう.

投稿2019/08/11 15:11

jimbe

総合スコア12646

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

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

Takuan2740

2019/08/11 16:10

nullの{}を外したら上手く表示させたいエラーメッセージが出力されました、ありがとうございます。ただmainメソッドの入力値を出力させる箇所で、新たにjava.lang.NullPointerExceptionが返されエラーが表示されるようになりました。入力値を表示させる為に二重for文を使うのはやめた方がいいでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問