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

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

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

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

Q&A

解決済

3回答

286閲覧

エラーが前提のコーディングに関して

kajap

総合スコア6

Java

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

0グッド

0クリップ

投稿2018/03/30 13:12

マインスイーパをCUIで作っていまして開けた場所が0だった場合その周りを開ける。その中に0があったらまた、周りを開けていくメソッドを作りました。
li :前回開けたx,y座標が半角スペース区切りで入ります。
map_open : 開いたところは1が入ります.
ans_map : 爆弾や周囲の爆弾の数が入ります。

Java

1public void open_arround(ArrayList<String>li) { 2 ArrayList<String>new_li=new ArrayList<>(); 3 for(String s:li){ 4 String st[] =s.split(" "); 5 int x = Integer.parseInt(st[0]); 6 int y = Integer.parseInt(st[1]); 7 for(int i = -1;i<2;i++){ 8 for(int j = -1;j<2;j++){ 9 try{//<<<<<<========疑問 10 if(map_open[x+i][y+j]!=1&&ans_map[x+i][y+j].equals("0")){//端っこのほうは範囲外を参照しようとしてエラーが出るよ 11 int a = x+i; 12 int b = y+j; 13 new_li.add(a+" "+b); 14 map_open[x+i][y+j]=1; 15 }else if(map_open[x+i][y+j]!=1){ 16 int a = x+i; 17 int b = y+j; 18 map_open[x+i][y+j]=1; 19 } 20 } 21 catch(ArrayIndexOutOfBoundsException e){} 22 } 23 } 24 } 25 if(new_li.size()>0){open_arround(new_li);} 26 else{return;} 27 } 28コード

こういった書き方はやめたほうがいいのでしょうか?

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

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

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

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

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

guest

回答3

0

むかしのDelphiで、TCPソケットコンポーネントでの状態遷移の通知に例外を使っていた覚えがあります。
まあ、それでもそれ専用の例外を定義してそれを発行させるようなことですんで、今回の例とはちと違います。

まあ、こういう正常系の通知、というか、処理が終わったからそこから抜けるために例外を使うというのは10歩ぐらい譲ってアリ(メリットがそれなりにあるならやってもいいかなぐらいでw)だとは思いますが、それでもそれ用の例外を定義して使うべきものですね。

今回の質問のようにあえてエラーを発生させるというのは、他の方の回答にもあるように、これはまずいですね。

#まー、とにかく動きゃええ、と言うならきちんと動くんだろうけど

投稿2018/04/01 12:28

編集2018/04/01 12:37
y_waiwai

総合スコア87749

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

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

0

ベストアンサー

例外が発生する前提でのコーディングはよっぽどの理由がない限り控えた方が良いです。
(個人的にはほぼ禁止で、対処療法として使用する程度だと思っています。)
理由は、コードの可読性の低下を招くためです。

今回のように例外前提のコーディングをしたくなる場合は下記が該当すると思います。
・判定処理を行うのが面倒
・例外をcatchすれば、判定処理と同等の事ができる

しかし、階層の深いところで例外を投げてしまった場合、それがどのような処理(判定)が原因で投げられたものなのか
致命的ななのか、それとも単なる判定処理を例外処理で同等の事をしているのか分からなくなります。
(今回のような小さな処理であれば終えますが、大きな処理・チーム等で作成する場合は顕著になります。)

質問者様はコーディングについての良し悪しの質問をされているので
きちんと分かりやすい判定処理のメソッド名を付け、それを実行する事で例外を投げる必要もなく読みやすいコーディングを行われる方が良いかと考えます。

投稿2018/04/01 12:13

RexiA7v

総合スコア112

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

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

0

場合によりけりと思いますが、個人的には避けたいです。

理由は・・・

論理の上でArrayIndexOutOfBoundsExceptionが発生するケースは無視してもよいことが確実なら問題ないですけど、何かの拍子に論理を変更したような場合「本来ArrayIndexOutOfBoundsExceptionが起きる可能性がないと思っていた箇所で誤ってそれを起こすようなヘマ」をしてしまうと、この例外が無条件に握りつぶされているために、プログラムを動かしてもすぐにそれと気づけないからです。


余談ですが・・・
Javaアプリのデバッグ実行時に「任意の例外が発生したときに中断」という条件で動かしてしまうとJVMの起動時に何度もNPEやArrayIndexOutOfRangeで止まってしまいます。Javaの標準ライブラリーの中に「ある種の例外を事前にチェックするのではなくあえて握りつぶしている」ような論理があるためだと思います。最適化、あるいは実装の都合であえてそういう方法を選んだのでしょうが、デバッグしずらくてめんどくさいなぁなんて感じることがあります。

投稿2018/03/30 13:41

KSwordOfHaste

総合スコア18394

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問