20220322のJavaに関する記事は3件です。

Java Silverの資格勉強で学んだことをアウトプットしていく

訳あってJava Silverの資格勉強をしているのだが、勉強していて 「これってこういうふうにしても動くんだ~」という発見や驚きがあったので そういうのを忘れない為に書き留めていこうと思う。 ・記事の対象者 ①Javaの初学者 ②Java Silverの資格勉強をしている人 ①制御文(if、for、while等)の中括弧を省略しても動作する Java Silverの勉強をしていて一番驚いたのがこれ!! 例えば以下のコードの場合でもエラーにならず動作する。 この場合はif文の次の1文がif文の条件に合致した時の処理として使われる。 例① if(i = 3)  System.out.println("処理1ですー。"); System.out.println("処理2ですー。"); 上記のコードは、下記のコードの動きと同一になる。 例② if(i = 3) {  System.out.println("処理1ですー。"); } System.out.println("処理2ですー。"); どちらを使っても動くには動くが、保守性や可読性等が下がるため、基本的には省略せず 例②のように {}を使用する事。 ②数値型にアンダースコア(_)を入れてもエラーにならない場合がある これも勉強していて驚いた事。アンダースコアを使った数値表記はJava SE7から導入されたらしく 下記のルールに従えば、場所や回数は自由らしい。 ・先頭と末尾には記述不可 ・記号の前後には記述不可 なので、例えば下記のようなコードはOKになる。 例① int a = 123_456_789; int b = 1_____9; しかし、下記のようなコードだとエラーになる。 例② int a = _123_456_789; int b = 123_456_789_; float b = 3_.1415; 基本数値型にアンダースコアを入れることは無いと思うが、覚えておいて損は無いと思う。 ③変数宣言時、変数名によってはエラーになる場合がある 変数宣言をする際、基本的にはその変数の使用用途によって変数名をきめると思うが その際、下記のような変数名だとエラーになる場合がある。 例① int $[a} = 100; int b.c = 200; 変数名やメソッド名等の名前の事を 「識別子」 と呼ぶが、識別子の命名規則により 上記のような変数名だとエラーになる時がある。 命名規則としては主に下記のルールがある。 ・予約語は使用できない ※予約語については下記参照 https://eng-entrance.com/java-reserved-word ・使える記号はアンダースコア(_)と通貨記号の2つ ・数字は2文字目からでないと使用できない。1文字めのみNG なので、下記のような変数名だと使用できる。参考にしていただければ・・・。 例② int $a = 100; int b_ = 200; int _0 = 300; ④インターフェースのデフォルトメソッドについて Java SE8からインターフェースに使えるようになったメソッド。 Java SE7までは、インターフェ∸スに「抽象メソッド」という具体的な処理を記述しない メソッドのみ使用できた。 使用例① interface testInterface{   abstract public void testMethod(); } Java SE8からは「default」というキーワードを記述することによって インターフェースに具体的なメソッドが記述できるようになった。 使用例② interface testInterface{   //default句を使うことで、interface内にメソッドを実装できる。 default String testName(){ return "名前"; } } public class testSample implements testInterface{ } public class testClass{ public static void main(String[] args) { testInterface sample = new testSample (); // 結果:「名前」が表示される。 System.out.println(sample.testName()); } } defaultが使えることによって、実装するクラス内でオーバーライドして メソッドの処理内容を記述する必要がなくなるというメリットがあるように思う。 絶賛下書き中!!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

春から大学生(情報・工学)の方へ~プログラミング入門3~(Java言語ってなあに?)

春から大学生(情報・工学)の方へ~プログラミング入門~(Java言語ってなあに?) 対象読者 この春から情報・工学系の大学生で以下の2記事を見ていただいた方 https://qiita.com/HaaSAtC/items/490d066bdbec8441a2f6 https://qiita.com/HaaSAtC/items/2687eef10dba08432a19 ご好評?をいただいております 3月20日に第1弾の記事を配信させていただきました。 わずか2日で100件近くもviewがありました。 全員新大学生なのかはわかりませんが、仮にそうだとしたらすごいですね まだ4月になってないのに予習しようなんて…この調子で頑張ってください 第2弾につきましても上げて5分で10人も見ていただき驚いてます。 Qiitaじゃなくて個人ブログだったらここまで伸びてないでしょうね ありがたい Javaの「文法」を学習したい方はこちらへ いろいろググった中で一番わかりやすくて体系的なサイトです 「オブジェクト指向」までの基礎文法を網羅 「一番かんたんなJava入門」 https://nobuo-create.net/category/java-beginner/ Java言語とは? これまで取り上げたC言語・C++言語と同様古めの言語。大学の授業でも取り扱う可能性が大いにあります。これまでのC言語・C++とはガラッと文法が変わります。 (↑のサイトを参照) 上から順番に「変数」や「関数」を書き並べていくものと異なります。(実はC++にもあるのですが)「オブジェクト指向」という新たな考え方が導入され、「クラス」単位での記述となるので、C言語で慣れてきた人にとっては初めは「???」だと思います。また、コンパイル(翻訳)後に生成されるファイルもJavaファイルと1対1対応ではありません。 (Javaファイルに書いた「クラス」の数だけ「クラスファイル」が生成されます) (授業でも習うと思いますが、「オブジェクト指向」はプログラムを効率よく書くための技術です) また、おそらく大学の授業では扱わないと思いますが、「Scala言語」、「Groovy言語」androidアプリの開発に用いられる「Kotlin言語」、Googleが開発した「Go言語」など派生言語を生み出してそれなりの人気を誇っています。 (近畿大学の授業では今年(2022年)からKotlinを扱うそうですが。いいなあ) Javaはもともとはサン・マイクロシステムズという会社が開発し、現在はオラクルという会社が開発を引き継いでいます。そのため、授業でJavaの文法についてわからないことがあったらおそらくオラクルのホームページにある解説ページを読み解くことになるでしょう。 https://www.oracle.com/jp/java/technologies/documentation.html また、C言語で言うgccコマンド(ターミナルにおいてC言語のプログラムを機械語に翻訳する)はjavacコマンドに、生成されたクラスファイル(C言語で言うexe,outファイル)はjavaコマンドで実行することになります。 環境構築~Java開発に必要なアプリのキット~  Javaのプログラムをクラスファイルに変換して実行するには、JDK(Java Development Kit)というキットが必要です。オラクル社などが無料で提供していますが、無料版は2年おきにサポートが切れる仕様になったらしく定期的にアップデートする必要があります。おそらく大学の先生から何らかの指示があるでしょう。  上記で、ターミナルにおいてJavaをjavacコマンドで変換するとクラスファイル(.class)になると言いましたが、実はScalaやGroovy、KotlinやGo言語も変換するとクラスファイルを生成します。これをJDKに含まれるJava Virtual Machine(JVM)をjavaコマンドによってターミナルで起動して、その中でクラスファイルを実行して結果を得るわけです。  さて、そんなJDKですが、様々なインストール方法があります。 1, オラクルの公式ホームページからダウンロード・インストールする方法。 2, Red Hat版JDKをインストールする方法。 私はやったことがないのでご自分で調べてください。(Red Hat JDK インストールなど) 3, Eclipse Pleiades(IDE(なんでもセット)のEclipseに様々な便利機能が追加されたものです)でまとめてインストールする(様々なバージョンがあるのでJavaを含んでいるか確認の上インストールすること) などなど、様々あります。(ほかにもあるかもしれない…) また、JetBrains社製、Java系言語用のなんでもセット(IDE)IntelliJ IDEA(インテリジェイ・アイディア)はとても便利ですが、残念ながらJDKは含んでいません。別にインストールしてください。 (インストール手順を詳しく見てみよう) おそらくJDK インストールなどと検索すれば丁寧に解説されたサイトが出てくることと思いますが、何をやっているのかここでもサクッと解説します。 JDKやPleiadesは公式サイトからzipファイル(圧縮ファイル)でダウンロードし、JDKの場合 PC\ローカルディスクC\Program Files に、PleiadesはローカルディスクCに解凍(右クリックで展開)することと思います。ネットからとってきたプログラムをあなたのコンピューターに装備するわけです。 そのあとJDKでは環境変数に"Path"を設定すると思います。 これは何なのでしょうか 英語でPathとは「経路」という意味ですが、コンピューターではファイルの場所を示します。どういう「経路」を通ってたどっていったらそのファイルが見つかるのか、ということですね。JDKをパソコンにインストールしたわけですが、もともとJDKはあなたのパソコンにとって異分子です。一般のユーザーはプログラマー(ITエンジニア)ではないので、Javaの開発ソフトは必要がありません。なので、JDKを用いるという設定にはなっていません。そこで、OSにJDKが大切なアプリであることを教えてあげる必要があるわけです。Windows10なら左下の検索欄から「システム環境変数」と検索し、JDKの入っているフォルダーを「重要なフォルダ」として登録するわけです。これがインストールガイドに出てくる「JAVA_HOME」「Path」の意味です。 最後に 読んでいただいてありがとうございました。 まだまだ続きを書くつもりでいますのでよろしくお願いいたします。 内容については不十分な点、不正確な点があるかもしれませんが、それについては学習していくうちに正しい情報にたどり着くと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Timber×Crashlytics でログをクラッシュレポート送信(Crashlytics編)

はじめに 日が空いてしまいましたが、後編です。 前編は「Timber×Crashlytics でログをクラッシュレポート送信(Timber編)」です。 前編では Timber を用いて、デバッグビルドとリリースビルドで、ログ出力を切り替える基盤を作成しました。 後編では、前編で作成した ReleaseTree クラスを用います。 そして、リリースビルド時は、「コンソールへログ出力しない」かつ「クラッシュ時にレポートを送信する」機能を組み込んでいきます。 Firebase Crashlytics Firebase Crashlytics は、モバイルアプリで発生したクラッシュを検知して、クラッシュが発生するまでのログを送信するクラッシュレポートツールです。 クラッシュレポートはFirebaseコンソールに集約され、クラッシュの分析や調査に役立ちます。 導入方法 前提 Googleアカウントの作成 Firebase Crashlytics のセットアップ セットアップに関しては、公式ドキュメントがかなり丁寧でわかりやすいので、本稿では省略します。 ※ Firebaseの導入と、Firebase Crashlyticsの導入に分かれている点に注意してください。 Firebase 公式 - Android プロジェクトに Firebase を追加する Firebase Crashlytics 公式 - Firebase Crashlytics を使ってみる プログラム変更 上記の公式手順をもとに、前編のTimber編 からの変更点を記載します。 build.gradle(:project) ※ プロジェクト直下 build.gradle buildscript { .... + dependencies { + classpath 'com.google.gms:google-services:4.3.10' + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.8.1' + } } .... build.gradle(:app) ※ app直下 build.gradle .... apply plugin: 'com.android.application' + apply plugin: 'com.google.gms.google-services' .... dependencies { implementation 'com.jakewharton.timber:timber:4.7.1' + implementation platform('com.google.firebase:firebase-bom:29.2.0') + implementation 'com.google.firebase:firebase-analytics' + implementation 'com.google.firebase:firebase-crashlytics' } MainActivity.java MainActivity.java public class MainActivity extends AppCompatActivity { - private final String TAG = MainActivity.class.getName() + "_TAG"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);      // 後編では不要なので消しておきます - Log.v(TAG, "Log VERBOSE"); - Log.d(TAG, "Log DEBUG"); - Log.i(TAG, "Log INFO"); - Log.w(TAG, "Log WARN"); - Log.e(TAG, "Log ERROR"); - Log.println(Log.ASSERT, TAG, "Log ASSERT"); - Timber.v("Timber VERBOSE"); - Timber.d("Timber DEBUG"); - Timber.i("Timber INFO"); - Timber.w("Timber WARN"); - Timber.e("Timber ERROR"); - Timber.wtf("Timber ASSERT"); + Button crashButton = new Button(this); + crashButton.setText("Test Crash"); + crashButton.setOnClickListener(new View.OnClickListener() { + public void onClick(View view) { + throw new RuntimeException("Test Crash"); // Force a crash + } + }); + addContentView(crashButton, new ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT)); } } クラッシュレポート まずは公式ドキュメントに従って、クラッシュを強制的に起こし、クラッシュレポートを確認します。 ※ Test Crash ボタンをタップすると、アプリが落ち、クラッシュレポートが送信されます。 Timber × Firebase Crashlytics 導入が完了したところで、前編のTimber編 で作成した ReleaseTree へ、Firebase Crashlytics を組み込んでいきます! プログラム変更 MyApplication.java MyApplication.java public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); if (BuildConfig.DEBUG) { Timber.plant(new Timber.DebugTree()); + // デバッグビルドの場合はクラッシュレポートを送信しないように設定 + FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(false); } else { Timber.plant(new ReleaseTree()); } } } ポイント ビルド方法によって、Timberの設定を切り替えます FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(false) の一文を書いておくことで、クラッシュレポートを送信しないように設定できます (この設定をしないと、開発中に実行時例外が出るたびにクラッシュレポートが送信されてしまいます) ReleaseTree.java ReleaseTree.java public class ReleaseTree extends Timber.Tree { @Override protected void log(int priority, @Nullable String tag, @NotNull String message, @Nullable Throwable t) { switch (priority) { - case Log.INFO: - case Log.WARN: - case Log.ERROR: - case Log.ASSERT: - // Crashlytics ログ出力処理を記述(Crashlytics編で記載) - break; + case Log.INFO : recordLog("I", message); break; + case Log.WARN : recordLog("W", message); break; + case Log.ERROR : recordLog("E", message); break; + case Log.ASSERT: recordLog("A", message); break; default: /* 下記の優先度は出力なし ・Log.VERBOSE ・Log.DEBUG */ break; } } + private void recordLog(String prefix, String message) { + FirebaseCrashlytics.getInstance().log(String.format("%s: %s", prefix, message)); + } } ポイント どの優先度かを識別したいので、プレフィックスをつける関数を呼び出します recordLog 関数内の FirebaseCrashlytics.getInstance().log() を呼び出すことで、クラッシュレポートのログとして記録されます MainActivity.java MainActivity.java public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); + Timber.i("メイン画面初期処理開始"); + Timber.d("デバッグログはコンソール出力のみ!"); Button crashButton = new Button(this); crashButton.setText("Test Crash"); crashButton.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { + Timber.e("Test Crash ボタンが押されました!"); throw new RuntimeException("Test Crash"); // Force a crash } }); addContentView(crashButton, new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + Timber.i("メイン画面初期処理終了"); } } ポイント 初期処理の開始~終了のタイミングでINFOログ、 DEBUGログを出力します ボタンを押されたときにERRORログを出力します 動作確認 それぞれのビルド方法でクラッシュを発生させます。 デバッグビルド コンソール出力 AndroidStudio のコンソールには下記のように出力されます。 I: メイン画面初期処理開始 D: デバッグログはコンソール出力のみ! I: メイン画面初期処理終了 E: Test Crash ボタンが押されました! クラッシュレポート クラッシュレポートは送信されません。 リリースビルド コンソール出力 実装したログはコンソールに出力されません。 クラッシュレポート クラッシュレポートが送信されます。 また、「ログ」タブには実装したログが出力されています! そして ReleaseTree で実装した通り、デバッグログはクラッシュレポートには出力されていません? ※ #2 はデフォルトで出力 おわりに いかがだったでしょうか。 これで、開発中のコンソール上だけで確認したい内容は DEBUG 、開発中とクラッシュレポートどちらでも確認したい内容は INFO 以上という使い分けができますね! また、Firebase Crashlytics には、より分析しやすくするために下記のような機能もあります。 ユーザーIDを設定 任意のKeyValueをログの項目として保持 任意のタイミングでクラッシュレポートを送信 これらを扱うような Util クラスを作成してもよさそうですね。 以上、より良いログ基盤の構築の一助になりましたら幸いです!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む