本記事では、Javaのswitch文における、定数に関するエラーとその原因について紹介します。
実行環境はAndroid Studio Giraffeです。
1. やりたいこと
「Androidアプリ開発の教科書 第3版 Java対応」の4章「イベントとリスナ」を読みながら、ボタンのクリックイベントに対応したリスナクラスを作成しました。ここでは、2つのボタンクラスbtClick(表示用)とbtClear(入力と出力のクリア用)のオブジェクトを用意し、それぞれに対して、共通のリスナクラスHelloListnerを引数として渡します。
以下にコードを記載します。本のサンプルコードと全く同じです。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btClick = findViewById(R.id.btClick);
HelloListener listener = new HelloListener();
btClick.setOnClickListener(listener);
Button btClear = findViewById(R.id.btClear);
btClear.setOnClickListener(listener);
}
// ボタンをクリックしたときのリスナクラス
private class HelloListener implements View.OnClickListener {
@Override
public void onClick(View view) {
EditText input = findViewById(R.id.etName);
TextView output = findViewById(R.id.tvOutput);
int id = view.getId();
switch (id) {
case R.id.btClick:
String inputStr = input.getText().toString();
output.setText(inputStr + "さん、こんにちは!");
break;
case R.id.btClear:
input.setText("");
output.setText("");
break;
}
}
}
}
2. Constant expression requiredエラー
しかし、以下の画像のようにコンパイルエラーが出てしまいました。メッセージを見ると、Constant expression requiredとされています。
どうやら、Javaのswitch文のcase節の条件は、「定数」である必要があるようです。
R.id.btClickやR.id.btClearのようなリソースID(res>layout>activity_main.xmlで定義)は、実行時に評価される値であり、定数式として認められない、ということでしょうか。
3. 解決策
そこで、以下のコードのように、分岐処理をif-elseで置き換えてみたところ、無事にビルドされました。また、2つのボタンが無事にAVD上に表示され、それぞれ正しく動作していました。
private class HelloListener implements View.OnClickListener {
@Override
public void onClick(View view) {
EditText input = findViewById(R.id.etName);
TextView output = findViewById(R.id.tvOutput);
int id = view.getId();
if (id == R.id.btClick) {
String inputStr = input.getText().toString();
output.setText(inputStr + "さん、こんにちは!");
} else if (id == R.id.btClear) {
input.setText("");
output.setText("");
}
}
}
参考:
「Androidアプリ開発の教科書 第3版 Java対応」WINGSプロジェクト 齊藤 新三 (著), 山田 祥寛 (監修)
コメント