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

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

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

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

2回答

1002閲覧

Javaの else if の使い方

onoko

総合スコア41

Java

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

1グッド

0クリップ

投稿2021/09/13 02:36

androidアプリをjavaで作っていて原因不明な点が発生しました。以下は副画面SupplyActivityのコードです。この中の後半以降、新レコード追加命令の次にあるif else条件節にさしかかると何らかのエラーのせいか画面が落ちるのです。そしてMainActivityの画面が現れます。if else条件が同じ変数に対するものでないからかと調べましたがそのような記述は見当たりませんでした。どうかご教示下さい。

java

1 2 3 //ー1錠ボタンクリック時処理 画面上の在庫数1減算 4 public void onButtonMinus1Click(View view){ 5 TextView tvStock = findViewById(R.id.tvStock); 6 if( Integer.parseInt( tvStock.getText().toString() ) > 0 ) { 7 tvStock.setText( String.valueOf( Integer.parseInt( tvStock.getText().toString() ) - 1 ) ); 8 } 9 } 10 11 //+1錠ボタンクリック時処理 画面上の在庫数1加算 12 public void onButtonPlus1Click(View view){ 13 TextView tvStock = findViewById(R.id.tvStock); 14 tvStock.setText( String.valueOf( Integer.parseInt( tvStock.getText().toString() ) + 1 ) ); 15 } 16 17 18 //実行ボタンクリック時処理 データベースレコード 追加・更新・削除 19 public void onButtonClick(View view) { 20 21 //画面View取得 22 RadioGroup radioGroup = findViewById(R.id.RadioGroup); 23 EditText edName = findViewById(R.id.edName); 24 EditText edUnit = findViewById(R.id.edUnit); 25 EditText edTimes = findViewById(R.id.edTimes); 26 EditText edDays = findViewById(R.id.edDays); 27 TextView tvStock = findViewById(R.id.tvStock); 28 CheckBox checkbox_mon = findViewById(R.id.checkbox_mon); 29 CheckBox checkbox_tue = findViewById(R.id.checkbox_tue); 30 CheckBox checkbox_wed = findViewById(R.id.checkbox_wed); 31 CheckBox checkbox_thu = findViewById(R.id.checkbox_thu); 32 CheckBox checkbox_fri = findViewById(R.id.checkbox_fri); 33 CheckBox checkbox_sat = findViewById(R.id.checkbox_sat); 34 CheckBox checkbox_sun = findViewById(R.id.checkbox_sun); 35 int checkedId = radioGroup.getCheckedRadioButtonId(); 36 37 //入力チェック後 DBレコード更新(過程:1.レコード削除 2.新レコード追加) 38 if ((edName.getText().toString().trim().length() > 0 ) && 39 (edUnit.getText().toString().trim().matches("[0-9]{1,3}")) && 40 (edTimes.getText().toString().trim().matches("[0-9]{1,3}")) && 41 (edDays.getText().toString().trim().matches("[0-9]{1,3}")) && 42 (checkedId != -1) 43 ) { 44 45 //0.処理型弁別 46 String rbtn = ""; 47 switch (checkedId) { 48 case R.id.RadioButton1: 49 rbtn = "1";/*補給処理*/ 50 break; 51 case R.id.RadioButton2: 52 rbtn = "2";/*事項変更処理*/ 53 break; 54 case R.id.RadioButton3: 55 rbtn = "3";/*この薬品をデータベースから削除する処理*/ 56 break; 57 default: 58 break; 59 } 60 61 //1.レコード削除 62 _helper = new DatabaseHelper(SupplyActivity.this); 63 SQLiteDatabase db = _helper.getWritableDatabase(); 64 String sqlDelete = "DELETE FROM medication2 WHERE _id = ?"; 65 SQLiteStatement stmt = db.compileStatement(sqlDelete); 66 stmt.bindLong(1, drugId); 67 stmt.executeUpdateDelete(); 68 69 //2.新レコード追加 70 if (("1".equals(rbtn) && !(drugId != -1 && oldStock != Integer.parseInt(tvStock.getText().toString()))) || 71 ("2".equals(rbtn) && !(drugId == -1)) 72 ) { 73 String sqlInsert; 74 if (drugId == -1) { 75 sqlInsert = "INSERT INTO medication2 (taker,name,unit,times,dayOfWeek,days,stock,updateTime) VALUES(?,?,?,?,?,?,?,?)"; 76 } else { 77 sqlInsert = "INSERT INTO medication2 (_id,taker,name,unit,times,dayOfWeek,days,stock,updateTime) VALUES(?,?,?,?,?,?,?,?,?)"; 78 } 79 stmt = db.compileStatement(sqlInsert); 80 81 int k = 0;/*id*/ 82 if (drugId == -1) { 83 84 } else { 85 k = 1; 86 stmt.bindLong(k, drugId); 87 } 88 89 k = k + 1;/*服用者*/ 90 stmt.bindString(k, taker); 91 92 k = k + 1;/*薬品名*/ 93 String name = edName.getText().toString(); 94 stmt.bindString(k, name); 95 96 k = k + 1;/*一回何錠*/ 97 int unit = Integer.parseInt(edUnit.getText().toString()); 98 stmt.bindLong(k, unit); 99 100 k = k + 1;/*一日何回*/ 101 int times = Integer.parseInt(edTimes.getText().toString()); 102 stmt.bindLong(k, times); 103 104 k = k + 1;/*服用曜日*/ 105 StringBuilder sb2 = new StringBuilder(); 106 if (checkbox_mon.isChecked()) { 107 sb2.append("1"); 108 } 109 if (checkbox_tue.isChecked()) { 110 sb2.append("2"); 111 } 112 if (checkbox_wed.isChecked()) { 113 sb2.append("3"); 114 } 115 if (checkbox_thu.isChecked()) { 116 sb2.append("4"); 117 } 118 if (checkbox_fri.isChecked()) { 119 sb2.append("5"); 120 } 121 if (checkbox_sat.isChecked()) { 122 sb2.append("6"); 123 } 124 if (checkbox_sun.isChecked()) { 125 sb2.append("7"); 126 } 127 String dayOfWeek2 = sb2.toString(); 128 if (!(dayOfWeek2.length() == 0)) { 129 sb2.append(" "); 130 dayOfWeek2 = sb2.toString(); 131 } 132 stmt.bindString(k, dayOfWeek2); 133 134 k = k + 1;/*何日分*/ 135 int days = Integer.parseInt(edDays.getText().toString()); 136 stmt.bindLong(k, days); 137 138 k = k + 1;/*在庫数*/ 139 int stock = Integer.parseInt(tvStock.getText().toString()); 140 if("1".equals(rbtn)){stock = stock + unit * times * days;} 141 stmt.bindLong(k, stock); 142 143 k = k + 1;/*更新時刻(ミリ秒記載)*/ 144 Date now = new Date(); 145 long nowTime = now.getTime(); 146 stmt.bindLong(k, nowTime); 147 148 stmt.executeInsert();/* 新レコード追加命令 */ 149 150 String show = ""; 151 if (drugId == -1) { 152 show = name + "を追加しました。"; 153 } 154 else if("1".equals(rbtn)){ 155 show = name + "を補給しました。"; 156 } 157 else if (oldStock == stock){ 158 show = name + "について修正しました。"; 159 } 160 else if (oldStock > stock){ 161 show = name + "を服用しました。"; 162 } 163 else { 164 show = name + "を追加しました。"; 165 } 166 167 Toast.makeText(SupplyActivity.this, show, Toast.LENGTH_LONG).show(); 168 169 } 170 else { 171 String show = ""; 172 if("3".equals(rbtn)){ 173 show = edName.getText().toString() + "を削除しました。"; 174 } 175 else if("1".equals(rbtn) && (drugId != -1 && oldStock != Integer.parseInt(tvStock.getText().toString()))){ 176 show = "修正を選んで実行を押してください。"; 177 } 178 else if("2".equals(rbtn) && drugId == -1){ 179 show = "補給を選んで実行を押してください。"; 180 } 181 182 Toast.makeText(SupplyActivity.this, show, Toast.LENGTH_LONG).show(); 183 184 } 185 } 186 else { 187 String show; 188 if (checkedId == -1){ show = "補給? 変更? このくすりを削除?";} 189 else if (edName.getText().toString().trim().length() == 0) { 190 show = "くすり・治療のなまえをいれてください。"; 191 } else { 192 show = "数字をいれてください。"; 193 } 194 Toast.makeText(SupplyActivity.this, show, Toast.LENGTH_LONG).show(); 195 196 197 198 } 199 } 200 201 202
退会済みユーザー👍を押しています

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

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

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

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

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

jimbe

2021/09/13 03:01

> 何らかのエラーのせいか画面が落ちる どこで何が起きているのかも特定せずに対処しようとするのは無謀です。 logcat には何も出ていないのでしょうか。どこまで実行されているかをどのように調査されましたでしょうか。
dodox86

2021/09/13 03:11

else ifと言っても特別なことは何もなく、 if (hoge) {   ; } else if (fuga) {   ; } は、 if (hoge) {   ; } else {   if (fuga) {     ;   } } と同等です。else if の問題ではなく、その中のコードの問題でしょう、
onoko

2021/09/13 03:31

if 条件節を/* */で一時的に取り除くと画面の落ちるのがやんだので、エラー箇所を特定したつもりだったのですが。いまもう一度 if 条件節をつけて動かしてみると、正常にメッセージが出ました。大変お騒がせしました。実行ボタンを押す前の操作の未特定の不具合なロジックが else if の中のコードに与えたエラーだったと想像しています。失礼しました。
dodox86

2021/09/13 03:36

解決できたのであれば原因と対応策を自己回答として投稿し、質問を閉じましょう。
jimbe

2021/09/13 03:56

ご提示のコードのうち、外部にある変数は drugId, taker, oldStock の三つだけです。 oldStock はメッセージの選択のみに使用しているようですから、drugId か taker でしょう。 ご忠告申し上げますが、if 文が(条件部分も処理部分も)大きすぎです。処理単位を決めてメソッドに分けて管理するようにしないと、作っている時は分かっていても後に分からなくなります。「完成したら直すつもりでした」という方もいらっしゃいますが、完成するまでが一番分割が必要です。
guest

回答2

0

※回答ではありません

以前のご質問から「曜日指定のコードが長くなりそう」と想像していたのですが、やはりチェックの if 文が並んでしまいますので、コードの分割という意味でも、曜日のチェックボックスを纏めて管理するクラス(とテスト環境)を作ってみました。
文字列←→チェックボックス群 の変換が getString/setString で済みますので、簡単になると思います。

DayOfWeek.java

java

1package com.teratail.q359202; 2 3import android.widget.*; 4 5import java.util.*; 6 7/** 曜日を表すチェックボックス群を管理 */ 8public class DayOfWeek implements CompoundButton.OnCheckedChangeListener { 9 private List<CheckBox> checkBoxList = new ArrayList<>(); 10 private Set<Character> checkedSet = new TreeSet<>(); 11 12 /** チェックボックスと対応する文字の登録 */ 13 void addCheckBox(CheckBox checkbox, char c) { 14 checkbox.setTag(Character.valueOf(c)); 15 checkbox.setOnCheckedChangeListener(this); 16 checkBoxList.add(checkbox); 17 onCheckedChanged(checkbox, checkbox.isChecked()); //初期値 18 } 19 20 /** 文字列内の対応文字の有無から各チェックボックスのOn/Offを設定する */ 21 void setString(String str) { 22 checkedSet.clear(); 23 if(str == null) return; 24 for(CheckBox cb : checkBoxList) { 25 cb.setChecked(str.indexOf((Character) cb.getTag()) >= 0); 26 } 27 } 28 29 /** 各チェックボックスのOn/Offを文字列内の文字の有無で返す */ 30 String getString() { 31 StringBuilder sb = new StringBuilder(); 32 for(Character c : checkedSet) 33 sb.append(c); 34 return sb.toString(); 35 } 36 37 @Override 38 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 39 if(!checkBoxList.contains(buttonView)) return; //不正利用チェック 40 if(isChecked) { 41 checkedSet.add((Character) buttonView.getTag()); 42 } else { 43 checkedSet.remove((Character) buttonView.getTag()); 44 } 45 } 46}

TestDayOfWeekActivity.java

java

1package com.teratail.q359202; 2 3import androidx.appcompat.app.AppCompatActivity; 4 5import android.os.Bundle; 6import android.view.View; 7import android.widget.*; 8 9public class TestDayOfWeekActivity extends AppCompatActivity { 10 private DayOfWeek dayOfWeek; 11 private EditText editText; 12 13 @Override 14 protected void onCreate(Bundle savedInstanceState) { 15 super.onCreate(savedInstanceState); 16 setContentView(R.layout.test_day_of_week_activity); 17 18 dayOfWeek = new DayOfWeek(); 19 dayOfWeek.addCheckBox(findViewById(R.id.checkbox_mon), '1'); 20 dayOfWeek.addCheckBox(findViewById(R.id.checkbox_tue), '2'); 21 dayOfWeek.addCheckBox(findViewById(R.id.checkbox_wed), '3'); 22 dayOfWeek.addCheckBox(findViewById(R.id.checkbox_thu), '4'); 23 dayOfWeek.addCheckBox(findViewById(R.id.checkbox_fri), '5'); 24 dayOfWeek.addCheckBox(findViewById(R.id.checkbox_sat), '6'); 25 dayOfWeek.addCheckBox(findViewById(R.id.checkbox_sun), '7'); 26 27 editText = findViewById(R.id.editText); 28 } 29 30 public void onGetClick(View view) { 31 editText.setText(dayOfWeek.getString()); 32 } 33 public void onSetClick(View view) { 34 dayOfWeek.setString(editText.getText().toString()); 35 } 36}

レイアウト: test_day_of_week_activity.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 xmlns:app="http://schemas.android.com/apk/res-auto" 5 xmlns:tools="http://schemas.android.com/tools" 6 android:layout_width="match_parent" 7 android:layout_height="match_parent" 8 tools:context=".TestDayOfWeekActivity"> 9 10 <LinearLayout 11 android:id="@+id/dayOfWeek" 12 android:layout_width="0dp" 13 android:layout_height="wrap_content" 14 android:orientation="horizontal" 15 app:layout_constraintLeft_toLeftOf="parent" 16 app:layout_constraintRight_toRightOf="parent" 17 app:layout_constraintTop_toTopOf="parent" > 18 19 <CheckBox 20 android:id="@+id/checkbox_mon" 21 android:layout_width="wrap_content" 22 android:layout_height="wrap_content" 23 android:text="" /> 24 <CheckBox 25 android:id="@+id/checkbox_tue" 26 android:layout_width="wrap_content" 27 android:layout_height="wrap_content" 28 android:text="" /> 29 <CheckBox 30 android:id="@+id/checkbox_wed" 31 android:layout_width="wrap_content" 32 android:layout_height="wrap_content" 33 android:text="" /> 34 <CheckBox 35 android:id="@+id/checkbox_thu" 36 android:layout_width="wrap_content" 37 android:layout_height="wrap_content" 38 android:text="" /> 39 <CheckBox 40 android:id="@+id/checkbox_fri" 41 android:layout_width="wrap_content" 42 android:layout_height="wrap_content" 43 android:text="" /> 44 <CheckBox 45 android:id="@+id/checkbox_sat" 46 android:layout_width="wrap_content" 47 android:layout_height="wrap_content" 48 android:checked="true" 49 android:text="" /> 50 <CheckBox 51 android:id="@+id/checkbox_sun" 52 android:layout_width="wrap_content" 53 android:layout_height="wrap_content" 54 android:text="" /> 55 </LinearLayout> 56 57 <Button 58 android:id="@+id/get" 59 android:layout_width="wrap_content" 60 android:layout_height="wrap_content" 61 android:text="get" 62 android:onClick="onGetClick" 63 app:layout_constraintLeft_toLeftOf="parent" 64 app:layout_constraintRight_toRightOf="parent" 65 app:layout_constraintTop_toBottomOf="@id/dayOfWeek" /> 66 <EditText 67 android:id="@+id/editText" 68 android:layout_width="0dp" 69 android:layout_height="wrap_content" 70 android:singleLine="true" 71 app:layout_constraintLeft_toLeftOf="parent" 72 app:layout_constraintRight_toRightOf="parent" 73 app:layout_constraintTop_toBottomOf="@id/get" /> 74 <Button 75 android:id="@+id/set" 76 android:layout_width="wrap_content" 77 android:layout_height="wrap_content" 78 android:text="set" 79 android:onClick="onSetClick" 80 app:layout_constraintLeft_toLeftOf="parent" 81 app:layout_constraintRight_toRightOf="parent" 82 app:layout_constraintTop_toBottomOf="@id/editText" /> 83</androidx.constraintlayout.widget.ConstraintLayout>

投稿2021/09/13 07:56

jimbe

総合スコア13209

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

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

onoko

2021/09/20 07:32

ありがとうございます。.setTag()メソッド、覚えます。
guest

0

自己解決

if文の条件節には問題はなく、条件によって実行されるコードに外部の不具合が与えて起こるエラーだと推測された。

投稿2021/09/13 03:35

onoko

総合スコア41

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問