タイトルに書くほどのネタじゃないけど、書き残しておかないと忘れそうなので、小さい話を2つメモとして残しておく。
- 自アプリのtargetSdkVersionを取得する
- Exceptionは並列に書ける
3つたまったら記事にしようと待っていたけど、たまる日が来ないかもしれないので2つにしてしまった。
1. 自アプリのtargetSdkVersionを取得する
自アプリのtargetSdkVersionを知りたかった。
アプリの情報だから簡単に取ってこれるのかと思ったけど、
- PackageManager取得
- Contextから自アプリのパッケージ名取得
- PackageManagerと自アプリパッケージ名からApplicationInfo取得
- ApplicationInfo#targetSdkVersionを取得
とやらねばならんかった。
書いてしまえば大したことじゃないのだけど、なかなかたどり着けなかったのだよ。
最初はBuild.VERSION.SDK_INTでやってたんだけど、これは端末が持つ情報だから、アプリに関係なく同じバージョンが取れるのでした。
2. Exceptionは並列に書ける
stackoverflowのこちらを読み、そのままコピーしたソースを使っていた。
しかし、それをFindBugsにかけると「例外がスローされないのに例外をキャッチしています」と言われてしまった。
記事では「Exception」だけで囲んでいたけども、
- NoSuchMethodException
- IllegalAccessException
- InvocationTargetException
があり得るらしい(Android Studioが出してくれた)。
最初のがgetMethod()で、残り2つはinvoke()だ。
分けるのも面倒なので、こう書いた。
(gattを別変数にコピーしているのは意味無さそうなので消したけど、いいよね?)
try {
Method localMethod = gatt.getClass().getMethod("refresh");
if (localMethod != null) {
return (Boolean) localMethod.invoke(gatt);
}
} catch (NoSuchMethodException e) {
Log.e(...);
} catch (IllegalAccessException e) {
Log.e(...);
} catch (InvocationTargetException e) {
Log.e(...);
}
そしたら今度はAndroid Studioが2つめ以降のExceptionに文句があるようだった。
JDK7とか書いてあるが、何を言っているのかわからなかったので、提案されるまま修正させてみた。
try {
Method localMethod = gatt.getClass().getMethod("refresh");
if (localMethod != null) {
return (Boolean) localMethod.invoke(gatt);
}
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
Log.e(...);
}
へー!
そんなことできるんだ。
これか。
複数の例外型のキャッチと型チェックが改善された例外再スロー
例外とはいえ、型が違うのに型の方をORできるなんて、不思議な感じがするな。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。