2016/06/27

[android][memo]targetSdkVersion取得とExceptionの並列

タイトルに書くほどのネタじゃないけど、書き残しておかないと忘れそうなので、小さい話を2つメモとして残しておく。

  1. 自アプリのtargetSdkVersionを取得する
  2. 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 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。