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

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

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

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

Q&A

解決済

4回答

724閲覧

switch文について

jin007

総合スコア34

Java

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

0グッド

0クリップ

投稿2018/12/05 08:36

編集2018/12/05 09:00

実現したいこと

西暦から干支を算出するプログラム。
ex)
1996を投げたら「ね」と返却される。

実施していること

POSTMANからjson方式で値を投げている。
→投げた値は正常に受け取れていてログで確認できている。

Json

1{ 2 "christian_era":"1996" 3}

作成したソース

servlet

java

1 service.etoConversion(requestGetDto); 2 3 logInfo("西暦:" + requestDto.getChristianEra()); 4 logInfo("干支:" + responseDto.getEto());

service

Java

1public EtoResponseDto etoConversion(EtoOutputRequestDto ChristianEra) throws IOException { 2 3 EtoOutputRequestDto requestDto = null; 4 EtoOutputResponseDto responseDto = null; 5 6 String stYear = requestDto .getYear(); 7 int year = Integer.parseInt(stYear); 8 9 switch (year%12) { 10 case 0: 11 responseDto.setEto("さる"); 12 break; 13 case 1: 14 responseDto.setEto("とり"); 15 break; 16 case 2: 17 responseDto.setEto("いぬ"); 18 break; 19 case 3: 20 responseDto.setEto("い"); 21 break; 22 case 4: 23 responseDto.setEto("ね"); 24 break; 25 case 5: 26 responseDto.setEto("うし"); 27 break; 28 case 6: 29 responseDto.setEto("とら"); 30 break; 31 case 7: 32 responseDto.setEto("う"); 33 break; 34 case 8: 35 responseDto.setEto("たつ"); 36 break; 37 case 9: 38 responseDto.setEto("み"); 39 break; 40 case 10: 41 responseDto.setEto("うま"); 42 break; 43 case 11: 44 responseDto.setEto("ひつじ"); 45 break; 46 default: 47 responseDto.setEto("エラー"); 48 } 49 return responseDto; 50 }

現状

POSTMANから投げられた値は取得できていて、「year%12」の計算もできているが
switch文でcatchに入ってしまう。

以下ログ

[干支出力API]catchに入った。 [干支出力API]西暦: null [干支出力API]干支: null

言葉足らずなところや、情報足らずのところもあると思います。
その際は修正いたしますのでアドバイスのほどよろしくお願いいたします。


補足:
現在躓いているところのみ掲載しています。
他のDtoに格納する処理はほかに記載してあります。

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

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

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

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

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

dice142

2018/12/05 08:38

エラーや例外が出ているかと思うのですが、ご提示いただけますか?
LouiS0616

2018/12/05 08:39

catchに入って、どのようなログを吐いているのですか?
LouiS0616

2018/12/05 08:50

このtry-catch文はなんのために使っているのでしょうか?なぜこんなにも広い範囲で、しかもExceptionを捕捉しているのでしょうか?
jin007

2018/12/05 08:52

>LouiS616さん。switchで落ちた時、または処理中にエラーが発生した際にcatchに入るようにしようと思いtry-catchを作りました。
LouiS0616

2018/12/05 08:56

今のtry文だと、なんでもかんでもキャッチした結果今回のようなトラブルを招きます。本当に必要な範囲で、本当に必要な例外だけをキャッチしてください。
jin007

2018/12/05 09:00

try-catchをなんでも使っていたので勉強になりました。ありがとうございます。
swordone

2018/12/05 09:17

> POSTMANから投げられた値は取得できていて、「year%12」の計算もできている この根拠は?このコードでは明らかにそこまでたどり着けない。
jin007

2018/12/05 10:29

そこのログは確認して、計算できていることを確認して消してしましました。すみません。
guest

回答4

0

String stYear = requestDto .getYear();

明らかにこの行がエラーですが。

投稿2018/12/05 08:40

y_waiwai

総合スコア87749

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

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

jin007

2018/12/05 08:48

elipseで書いているのですが赤波線などエラーらしき表示はされていないです。そのエラーではないでしょうか?
y_waiwai

2018/12/05 08:51

requestDtoにはnullがはいってますぜ
jin007

2018/12/05 08:55

EtoOutputRequestDto requestDto; と変更して再度実行したのですが結果は質問文と変わらない状態です。
guest

0

自己解決

以下のように修正しました。

反省点:
・dtoのインスタンスの生成をしておらず、コード上には存在しないdtoにsetしようとしていた為setできなかった。

・returnした値を呼び出し元で受け取っていなかった。

以上のことから、以下のように修正しました。

servlet

java

1dto = service.etoConversion(requestGetDto);

service

java

1public EtoOutputDto etoConversion(EtoOutputRequestDto ChristianEra) throws IOException { 2 // DTOを定義 3 EtoOutputRequestDto requestDto = new EtoOutputRequestDto(); 4 EtoOutputDto Dto = new EtoOutputDto(); 5 6 String stYear = requestDto .getYear(); 7 int year = Integer.parseInt(stYear); 8 9 switch (year%12) { 10 case 0: 11 Dto.setEto("さる"); 12 break; 13 case 1: 14 Dto.setEto("とり"); 15 break; 16 case 2: 17 Dto.setEto("いぬ"); 18 break; 19 case 3: 20 Dto.setEto("い"); 21 break; 22 case 4: 23 Dto.setEto("ね"); 24 break; 25 case 5: 26 Dto.setEto("うし"); 27 break; 28 case 6: 29 Dto.setEto("とら"); 30 break; 31 case 7: 32 Dto.setEto("う"); 33 break; 34 case 8: 35 Dto.setEto("たつ"); 36 break; 37 case 9: 38 Dto.setEto("み"); 39 break; 40 case 10: 41 Dto.setEto("うま"); 42 break; 43 case 11: 44 Dto.setEto("ひつじ"); 45 break; 46 default: 47 Dto.setEto("エラー"); 48 } 49 return Dto; 50 }

ご回答くださった皆様、ありがとうございました。
インスタンス化の勉強が甘かったことを再認識しました。

投稿2018/12/05 10:28

jin007

総合スコア34

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

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

0

インスタンス化のお勉強をした方がよろしいかとおもいます。

null.getYear()になってますよ。
NULLから数字とれるわけないじゃないですか

投稿2018/12/05 08:56

azuapricot

総合スコア2341

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

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

jin007

2018/12/05 09:02

ご指摘ありがとうございます。 その書き方とても分かりやすく勉強になります。
guest

0

Java

1 EtoOutputRequestDto requestDto = null; 2 EtoOutputResponseDto responseDto = null;

でnullセットしてるのだから
requestDtoおよびresponseDtoの呼び出しすべて例外になるはず

投稿2018/12/05 08:43

rururu3

総合スコア5545

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

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

jin007

2018/12/05 08:47

そのご指摘いただいた部分で nullをセットしない方法で宣言するということでしょうか?
rururu3

2018/12/05 08:52

nullにしないといけないからそう宣言したと思うのですが、nullであってるならばrequestDtoおよびresponseDtoの呼び出しすべて例外になるのでその対策をする。nullが間違ってるなら考えて修正していけばいいかと思います。
jin007

2018/12/05 08:57

nullである必要はないので修正いたしましたが結果は変わらないです。 EtoOutputRequestDto requestDto;
rururu3

2018/12/05 09:11

その宣言の場合初期化されてない可能性がありますとかでコンパイルできない気もしますが、 とりあえず他の方が記載されている通り、インスタンス化を勉強してください ※EtoOutputRequestDto requestDto;ってやってrequestDto.getYear()で意図したもの取れるのかというところも考えてほしい
jin007

2018/12/05 10:30

インスタンス生成していないところに対してsetもgetもできないことに気づきました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問