検索

キーワード


【Java】JSPのディレクティブ

【Java】JSPのディレクティブ

こんにちは。エンジニアの新田です!ここでは、システムエンジニアとして働いている私が、システム開発手法や開発言語について紹介していこうと思います。今回は、JSPのディレクティブについて紹介します。Javaについて勉強している方、Webアプリケーションを構築したいと思っている方の参考になれば幸いです!関連記事:【Java】JSPの基本的な構文 【Java】JSPでタグライブラリを使う(JSTL)JSPのディレクティブディレクティブではJSPページの文字コード指定や、外部ファイルの読み込みなど、JSPページに関する制御文を記述する事ができます。pageディレクティブ【頻繁に使われる属性】importJSPページでJavaのクラスをimportする場合に使います。(Javaのimport文と同じ役割)   ← カンマ区切りで複数指定することも可能なお、以下のパッケージはデフォルトでインポートされているためインポートする必要はありません。java.lang.* javax.servlet.* javax.servlet.jsp.* javax.servlet.http.*■importの例 ・・・ sessionこのページでの暗黙セッションオブジェクトを使用するかどうかを指定するします。(デフォルトは使用する=true)■trueが指定された場合(暗黙のセッションオブジェクトを使用する)※デフォルトセッションが開始されていなければ、新規に生成する。継続しているセッションがあれば、それを利用する。■falseが指定された場合(暗黙のセッションオブジェクトを使用しない)暗黙セッションオブジェクトに関する操作を行った場合、コンパイルエラーになる。contentTypeJSPページのMIMEタイプとエンコーディングを指定します。(省略した場合は、デフォルトで「ISO-8859-1」が使用されます)※日本語を使用する場合は、文字化けを防ぐためにエンコーディングを必ず設定する必要があります。■importの例 ...【その他の属性】languageJSPページで使用するスクリプト言語を指定します。(現状ではJavaしか指定できないため設定不要、デフォルト値として「java」が設定される)extendsJSPページを他のクラスのサブクラスにする場合、スーパークラスを指定します。isELIgnoredEL式を無効にするかどうかを指定する(デフォルトは、有効=false)。trueを設定するとEL式が無効になり、falseを設定すると有効になります。pageEncodingJSPページのエンコーディングを指定します。デフォルトは「contentType」で指定した文字コードが使用されます。errorPageエラーが発生した場合に表示するページを指定します。指定しない場合はデフォルトのエラーページが表示されます。isErrorPageJSPページがエラー表示用のページであることを指定します。(デフォルトは、false = エラー表示用ページではない)「errorPage」でエラー表示先を指定した場合には、「isErrorPage」を「true」に設定する必要があります。「true」が指定された場合、暗黙オブジェクトの「exception」が利用可能になります。bufferJSPページから出力されるデータをバッファしてからクライアントに返すかを指定します。(デフォルトは「8kb」)バッファしない場合は、「none」を指定する。「8kb」のように容量を指定すると、出力データを指定容量までバッファしてからクライアントにまとめて送信します。autoFlushbuffer(バッファ)を使用したときに指定の容量を超える出力データがあった場合の処理を指定します。(デフォルトは「true」)「true」の場合は指定容量に達したときに自動的にクライアントにデータを送信します。「false」の場合は指定容量に達したときに例外を発生させます。isThreadSafeスレッドセーフで実行するかどうかを指定します。(デフォルトは「true」)「true」の場合は複数のリクエストが合った場合に同時に実行することを許可します。「false」の場合は複数リクエストを1つずつ順次処理します。infoJSPページに関する任意の情報を記述します。製作者や作成年月日など、どんなデータでも構いません。includeディレクティブincludeディレクティブを記述した位置に他のHTMLファイルやJSPファイルなどのファイルを読み込み、ソースコードを挿入します。サーブレットへに変換する前に、指定されたファイルの内容を挿入することで、全体をひとつのJSPサーブレットに変換します。ファイルの指定方法は、「/」から記述した場合は、ドキュメントルートからの絶対パスを記述します。それ以外の場合は、includeディレクティブを記述したJSPファイルからの相対パスを記述します。■includeの例ディレクトリ構成は以下の通りとします[D] -- webContents (ドキュメントルート) | +-- jsp | | +-- hello.jsp | +-- include | | +-- (includetarget.jsp)hello.jsp include directive includetarget.jspinclude target実行結果taglibディレクティブJSPでは定期的に使われるような処理をまとめてタグと呼ばれるものに登録しておく事が出来ます。そのタグを集めた物がタグライブラリで、標準タグライブラリと自分で作成したタグを集めたカスタムタグライブラリがあります。このタグライブラリを使うときにtaglibディレクティブを使用します。※タグライブラリについては別の記事で詳しく説明します。「taglib」ディレクティブの記述方法は以下の2通りがあります。■「tldファイル」を使う場合■タグファイルを保存したディレクトリを指定する場合関連記事:【Java】JSPの基本的な構文 【Java】JSPでタグライブラリを使う(JSTL)

【Java】列挙型についての紹介!

【Java】列挙型についての紹介!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!列挙(Enumeration)列挙型(Enum型)複数の定数をひとつにまとめてグループ化することができる型です。列挙型で定義された値のことを列挙子と呼びます。Javaにおいて列挙型はクラスです。java.lang.Enumクラスが継承されています。クラスには勿論フィールドや定義した値を操作することができるメソッドが実装されています。列挙型はプリミティブ型やクラスと同じように型として扱えますので、変数の宣言や代入、制御構文での論理式、メソッドへの引数や戻り値としても使用することができます。一般的なクラスと異なる大きな点は、新しいインスタンス生成が外部からできないことです。列挙型で定義された列挙子はプログラムの中で1つしかない「定数」として扱われます。列挙型は上手く利用すればプログラムの保守性や可読性の向上につながる便利な機能です。関連記事リンク:【Java】変数、定数の宣言と変数の列挙型、代入、型変換、型推論の使い方列挙型(Enum型)の宣言アクセス修飾子 enum 列挙名 {列挙子,列挙子2...};列挙子はすべて大文字で宣言し、単語間の区切りを『_』(アンダースコア)で表すのが一般的です。例:COLOR_RED, COLOR_BLUE等 宣言のサンプルコードを確認しましょう。public class Test { //列挙型(Enum型)の宣言 protected enum Color { COLOR_PINK, COLOR_LIGHT_BLUE, COLOR_INDIGO, COLOR_YELLOW }; }これで列挙型(Enum型)の宣言と列挙子を格納することができました。関連記事リンク;【Java】 アクセス修飾子について紹介列挙型の使用方法型の宣言が出来たら定義した値(列挙子)を操作しましょう。列挙子は以下のような構文で使用することができます。列挙名.列挙子名ex)Color.COLOR_PINK宣言のサンプルコードに追記して実装してみます。public class Test { //列挙型(Enum型)の宣言 protected enum Color { COLOR_PINK, COLOR_LIGHT_BLUE, COLOR_INDIGO, COLOR_YELLOW }; //列挙子の操作 public static void main(String[] args) { System.out.println(Color.COLOR_PINK); } }出力結果COLOR_PINKフィールド/メソッド/コンストラクタの定義の仕方列挙型はEnumクラスを継承しているので、フィールドやメソッド、コンストラクタを定義することができます。フィールドとコンストラクタを定義することで列挙子へ独自を値を持たせることが可能になります。またメソッドを使用し列挙子を操作することができます。関連記事リンク:【Java】 メソッドについて紹介!/【Java】 コンストラクタの紹介!列挙子への値の付与フィールドとコンストラクタを定義することで列挙子へ独自の値を付与することが可能になります。これにより、数値や別の識別子で列挙子を管理することができるメリットがあります。値を付与した列挙子の書き方は以下のようになります。列挙名.列挙子名(値)ex)Color.COLOR_PINK(1) Color.COLOR_PINK("桃色")列挙子の後に値を「( )」で囲み付与します。数値や文字列を値として付与することが可能です。列挙子へ付与された値は以下のような構文で使用することができます。列挙名.列挙子名.値のフィールド名ex)Color.COLOR_PINK.levelサンプルコードで確認しましょう。public class Test { //列挙型(Enum型)の宣言 protected enum Color { COLOR_PINK(128), COLOR_LIGHT_BLUE(100), COLOR_INDIGO(50), COLOR_YELLOW(0); // フィールドの定義 private final int level; // コンストラクタの定義 private Color(int level) { this.level = level; } } //列挙子の操作 public static void main(String[] args) { System.out.println(Color.COLOR_PINK.level); } }出力結果128文字列(String型)でも同様に実装することができます。コンストラクタのアクセス修飾子はprivateのみ使用可能となっています。フィールド定義の修飾子finalはTestクラス内からの操作を防いでいます。コンストラクタを記述しない場合、エラーが発生しますので注意しましょう。関連記事リンク:【Java】final 修飾子について紹介!/【Java】 アクセス修飾子について紹介int型とString型の両方の値付与二つの値を同時に付与することも可能です。サンプルコードで確認しましょう。public class Test { //列挙型(Enum型)の宣言 protected enum Color { COLOR_PINK("桃色",128), COLOR_LIGHT_BLUE("水色",100), COLOR_INDIGO("紺色",50), COLOR_YELLOW("黄色",0); // フィールドの定義 private final String japanese; private final int level; // コンストラクタの定義 private Color(String japanese,int level) { this.level = level; this.japanese=japanese; } } //列挙子の操作 public static void main(String[] args) { System.out.println(Color.COLOR_PINK); System.out.println(Color.COLOR_PINK.japanese); System.out.println(Color.COLOR_PINK.level); } }出力結果COLOR_PINK 桃色 128メソッドの紹介Enumクラスにはいくつかのメソッドが実装されています。Enum型の配下にメソッドを定義して列挙子を操作できます。ここでは基本的な5つのメソッドを紹介します。String name()Enum定数(列挙子)の名前を取得します。オーバーライドができないのがtoStringメソッドと異なる点です。参照:javadoc-Enumint ordinal()列挙子の順序を取得します。順序は0始め。String toString()Enum定数(列挙子)の名前を取得します。通常はnameメソッドと同じ結果を返しますが、オーバーライドする事で実装者が振る舞いを決めることができます。public static 列挙型 valueOf(String 列挙子名)指定された文字列と一致するEnum型の列挙子を取得します。nullを指定した場合、IllegalArgumentException例外が発生します。public static 列挙型配列 values()対象の列挙型のすべての列挙子を取得します。サンプルコードで確認しましょう。import java.util.Arrays; public class Test { //列挙型(Enum型)の宣言 protected enum Color { COLOR_PINK, COLOR_LIGHT_BLUE, COLOR_INDIGO, COLOR_YELLOW; @Override public String toString() { return ""; } } //列挙子の操作 public static void main(String[] args) { //nameメソッド System.out.println(Color.COLOR_PINK.name()); //ordinalメソッド System.out.println(Color.COLOR_LIGHT_BLUE.ordinal()); //toStringメソッド System.out.println(Color.COLOR_INDIGO.toString()); //valueOfメソッド System.out.println(Color.valueOf("COLOR_YELLOW")); //valuesメソッド Color[] list=Color.values(); System.out.println(Arrays.toString(list)); } }出力結果COLOR_PINK 1 [, , , ]※valueOfメソッドとvaluesメソッドは出力した際に内部でtoStringメソッドを呼んでいます。列挙子を利用した条件分岐の操作Enumクラスにメソッドが実装されているおかげで、列挙子を条件分岐などの操作で使用することが可能になっています。if文の分岐処理列挙子と文字列の比較を条件にして処理を分けます。『Color.COLOR_PINK=="COLOR_PINK"』のようにそのままの値に==演算子を使用するとif文の処理が正しく行えずエラーが発生してしまいますが、メソッドを以下の様に使用することで条件分岐が可能になります。toStringメソッドを使った条件(Stringの比較はequalsメソッドを使いましょう。)※サンプルコードでは可読性を考慮して定数lbに格納しています。Color.COLOR_LIGHT_BLUE.toString().equals("COLOR_LIGHT_BLUE")valueOfメソッドを使った条件Color.COLOR_PINK == Color.valueOf("COLOR_PINK")サンプルコードを確認しましょう。public class Test { //列挙型(Enum型)の宣言 protected enum Color { COLOR_PINK, COLOR_LIGHT_BLUE, COLOR_INDIGO, COLOR_YELLOW; } //列挙子の操作 public static void main(String[] args) { final String lb= Color.COLOR_LIGHT_BLUE.toString(); if (lb.equals("COLOR_LIGHT_BLUE")) { System.out.println("列挙子と文字列の一致"); }else{ System.out.println("列挙子と文字列の不一致"); } if (Color.COLOR_INDIGO == Color.valueOf("COLOR_YELLOW")) { System.out.println("列挙子と文字列の一致"); }else{ System.out.println("列挙子と文字列の不一致"); } } }出力結果列挙子と文字列の一致 列挙子と文字列の不一致switch文の分岐処理Java7以降の環境ではswitch文でString型を指定できるようになりましたが、列挙型の列挙子でもString値と同じようにSwitch文で値を指定することができます。分岐が多くなったときはif文の代わりにswitch-case文を使うと、可読性が高い実装ができます。以下のような記述でcaseに列挙子をセットすることができます。Enum型名は必要ありません。case COLOR_PINK:サンプルコードを確認しましょう。public class Test { //列挙型(Enum型)の宣言 protected enum Color { COLOR_PINK, COLOR_LIGHT_BLUE, COLOR_INDIGO, COLOR_YELLOW; } //列挙子の操作 public static void main(String[] args) { Color c = Color.COLOR_PINK; switch (c) { case COLOR_PINK: case COLOR_YELLOW: System.out.println("暖色"); break; case COLOR_LIGHT_BLUE: case COLOR_INDIGO: System.out.println("寒色"); break; default: System.out.println("無色"); break; } } }出力結果暖色【補足】列挙型と定数(final修飾子を使って宣言された変数)の使い分け列挙型で定義された列挙子はプログラムの中で1つしかない「定数」として扱われます。一方で、final修飾子を使って宣言された変数も定数として扱うことができます。◆列挙型public class Test { //列挙型(Enum型)の宣言 protected enum Color { COLOR_PINK, COLOR_LIGHT_BLUE, COLOR_INDIGO, COLOR_YELLOW; } }◆定数(final修飾子を使って宣言された変数)public class Test { //定数の宣言 public static final int COLOR_PINK = 0x0001; public static final int COLOR_LIGHT_BLUE = 0x0002; public static final int COLOR_INDIGO = 0x0003; public static final int COLOR_YELLOW = 0x0004; }列挙型を拡張して独自の値を持たせるなどしない場合は同じような使い方ができるのでどちらを使う方が良いのかを迷う時があると思います。判断基準の一つとして、両者の特徴の違いを意識して使用選択することをお勧めします。列挙型決められた値以外は取り扱えないため、定数の種類・数が明確である。また複数人が関わるプログラムでは認識の疎通を図れる。⇒定数そのものに意味がある場合の使用を推薦定数取り得る値・種類が豊富であるため、表現できる範囲が広い。⇒値そのものに意味がある場合の使用を推薦これらを上手く利用してプログラムの保守性や可読性の向上につながることを願っています!関連記事リンク:【Java】変数、定数の宣言と変数の列挙型、代入、型変換、型推論の使い方        【Java】final 修飾子について紹介!/【Java】 アクセス修飾子について紹介

【Java】Eclipse - Pleiades All in One インストール手順

【Java】Eclipse - Pleiades All in One インストール手順Eclipse、Pleiades All in OneEclipseEclipse は、Java をはじめ、いくつかの言語に対応した統合開発環境です。今回は、Pleiades All in One を使用します。PleiadesPleiades All in One は、Eclipse 本体に、日本語化を行うための Pleiades プラグイン、その他プラグインをまとめたパッケージです。Full Edition であれば、インストールや環境設定が不要で、すぐに利用できます。手順概要(Windows の場合) インストール不要の3ステップです!1.ダウンロード2.解凍3.起動手順1.ダウンロード公式サイトよりダウンロードします。https://mergedoc.osdn.jp/バージョン選択Eclipse 最新版をクリックします。[Pleiades All in One ダウンロード]ダウンロードファイル選択お使いのOSによってダウンロードするファイルが違います。Java の開発を行うので、対象の OS - FullEdition - Java の Download をクリック。[Pleiades All in One Eclipse ダウンロード]ファイルダウンロード圧縮ファイルをダウンロードします。手順2.解凍ダウンロードしたファイルを解凍します。注意!Windows の場合、ダウンロードしたファイルの解凍に失敗することがあります。その場合は、7-Zip で解凍してください。Pleiades All in One ダウンロードページにリンクがあります。手順3.Eclipse 起動インストールは不要で、すぐに利用可能です。(Windows)解凍した pleiades-n.nn.n\eclipse\eclipse.exe で起動ワークスペース選択が表示されます。決まっていない場合はそのままで大丈夫です(あとで変更可能です)。Eclipse 起動完了です。(Mac)ダウンロードした dmg ファイルを開いてドラッグ&ドロップ※Macセットアップ方法は、Pleiades All in One ダウンロードページにリンクがあります。以上

【Java】例外制御、例外の活用方法入門

【Java】例外制御、例外の活用方法入門

こんにちは、駆け出しエンジニアの伊藤です。東京ITカレッジのJava研修で学んだ内容を復習も兼ねて記事にしたいと思います。今回は、Javaの例外制御について、throws、throw、printStackTrace()、getMessage()、getCause()などを使った制御方法について解説していきます。Javaやプログラムについて勉強し始めた方の参考になれば幸いです!(eclipseを使用して計算を行っています)また、この記事に関して、例外の概要や try-catch、マルチキャッチ等について知っている方を対象としています。関連記事にて、例外の概要や try-catch について詳しく解説していますので、理解を深めたい方はご一読ください。関連記事:例外の概要、例外クラスについて ‐Exception、RuntimeException、Errorなど     例外制御(try-catch、try-catch-finally、マルチキャッチ など)     try - with - resources 構文     独自例外クラス例外制御、例外処理について(検査例外)Javaでは、プログラム実行中に例外が発生する可能性がある場合、例外発生時の処理をプログラムに記述しないと、コンパイルエラーが発生するようになっています。このような例外を検査例外と呼びます。(検査例外については、関連記事に解説があります)。その為、例外発生の可能性がある場合に、例外処理を記述するための構文が用意されています。例外処理は、以下のいずれかの方法で記述する必要があります。・try - catch でキャッチする・throws句で例外を宣言する(呼び出し側で try-catch を実装する場合)例外の伝播例外の発生が考えられる場合は、例外処理を記述しますが、呼び出し先のメソッドで例外が発生し、そこで適切に例外処理が行われず、呼び出し側に例外が返される場合があります。このように呼び出し側のメソッドにまで影響が及ぶことを、「例外の伝播」と言います。検査例外(Exceptionクラス系)は、mainメソッドもしくは、呼び出し先の各メソッドで try-catch 構文を使って適切に例外処理する必要があります。しかし、呼び出し先の各メソッドで例外処理を行わず、呼び出し側に例外処理を一任したい場合、メソッド宣言の後に throws を記述することで、呼び出し側へと例外を投げる(スローする)ことができます。(この場合、検査例外によるコンパイルエラーは発生しない)関連記事:例外の概要、例外クラスについて ‐Exception、RuntimeException、Errorなどthrowsthrows を宣言することで、例外をそのメソッド内では処理せず、呼び出し側のメソッドに例外を投げる(スローする)ことができます。<throws 構文>アクセス修飾子 戻り値 メソッド名() throws 例外クラス { メソッド内容 }実際にサンプルプログラムで見てみましょう。 1 // throws構文サンプル 2 package exception.gaiyou; 3 4 import java.io.File; 5 import java.io.FileWriter; 6 import java.io.IOException; 7 8 public class ThrowsSample { 9 10 public static void main(String[] args) { 11 try { 12 //呼び出し先メソッド名 13 sample(); 14 //呼び出し先メソッドで例外が発生すると、ここに移行 15 } catch(IOException e) { 16 System.out.println("ファイルもしくは入出力処理の失敗、または割り込みの発生により例外が発生しました。"); 17 } 18 } 19 20 // throws宣言 21 private static void sample() throws IOException { 22 System.out.println("-----実行結果-----"); 23 FileWriter fw = null; 24 File file = new File("c:\\Sample\\Hello.txt"); 25 fw = new FileWriter(file); 26 System.out.println("ファイルの作成に成功しました。"); 27 //ファイルの書き込み 28 fw.write("Hello World \n"); 29 fw.write("こんにちは!"); 30 System.out.println("ファイルの書き込みに成功しました。"); 31 //ファイルを閉じる 32 if (fw != null) { 33 fw.close(); 34 System.out.println("正常にファイルを閉じました。"); 35 } 36 } 37 }-----実行結果----- ファイルの作成に成功しました。 ファイルの書き込みに成功しました。 正常にファイルを閉じました。throws構文サンプルでは 、sampleメソッドで「ファイルを作成→書き込み→ファイルを閉じる」ということを行っています。sampleメソッドの宣言後に、throws を記述したことで検査例外のコンパイルエラーが起こらず、呼び出し側の mainメソッドに例外処理が任されています。もしも、呼び出し先メソッドで throws を記述せず、mainブロックで try-catch をしなかった場合、以下のようになります。 1 // throws エラーサンプル 2 package exception.gaiyou; 3 4 import java.io.File; 5 import java.io.FileWriter; 6 7 public class ThrowsSample2 { 8 9 public static void main(String[] args) { 10 //メソッド呼び出し 11 sample(); 12 } 13 14 // throws宣言 15 private static void sample() { 16 System.out.println("-----実行結果-----"); 17 FileWriter fw = null; 18 File file = new File("c:\\Sample\\Hello.txt"); 19 fw = new FileWriter(file); 20 System.out.println("ファイルの作成に成功しました。"); 21 //ファイルの書き込み 22 fw.write("Hello World \n"); 23 fw.write("こんにちは!"); 24 System.out.println("ファイルの書き込みに成功しました。"); 25 //ファイルを閉じる 26 if (fw != null) { 27 fw.close(); 28 System.out.println("正常にファイルを閉じました。"); 29 } 30 } 31 }Exception in thread "main" java.lang.Error: Unresolved compilation problems: 処理されない例外の型 IOException 処理されない例外の型 IOException 処理されない例外の型 IOException 処理されない例外の型 IOException at exception.gaiyou.ThrowsSample2.sample(ThrowsSample2.java:19) at exception.gaiyou.ThrowsSample2.main(ThrowsSample2.java:11)検査例外を記述していないため、コンパイルエラーが発生してしまいます。次のサンプルプログラムは、throws 宣言はしていますが、呼び出し側で try-catch していないものです。 1 // try-catch エラーサンプル 2 package exception.gaiyou; 3 4 import java.io.File; 5 import java.io.FileWriter; 6 import java.io.IOException; 7 8 public class ThrowsSample3 { 9 10 public static void main(String[] args) { 11 //呼び出し先メソッド名 12 sample(); 13 } 14 15 // throws宣言 16 private static void sample() throws IOException { 17 System.out.println("-----実行結果-----"); 18 FileWriter fw = null; 19 File file = new File("c:\\Sample\\Hello.txt"); 20 fw = new FileWriter(file); 21 System.out.println("ファイルの作成に成功しました。"); 22 //ファイルの書き込み 23 fw.write("Hello World \n"); 24 fw.write("こんにちは!"); 25 System.out.println("ファイルの書き込みに成功しました。")>; 26 //ファイルを閉じる 27 if (fw != null) { 28 fw.close(); 29 System.out.println("正常にファイルを閉じました。"); 30 } 31 } 32 }Exception in thread "main" java.lang.Error: Unresolved compilation problem: 処理されない例外の型 IOException at exception.gaiyou.ThrowsSample3.main(ThrowsSample3.java:12)mainメソッドで、コンパイルエラーが発生しています。呼び出し先で throws で例外を投げる場合、呼び出し側では try-catch で例外をキャッチしなくてはいけません。また、throws 宣言後の例外クラスはカンマで区切って複数指定することも可能です。関連記事:例外の概要、例外クラスについて ‐検査例外・非検査例外など     例外処理(try-catch、try-catch-finally、マルチキャッチ など)     java.io.Fileクラスの使い方(ファイル一覧の取得、フィルタ)throwthrow を使うことで、任意の箇所で任意の例外を発生させることができます。throw 構文throw new 例外クラス;throw とは投げる、という意味です。任意の例外クラスで例外を発生させることができます。実際にサンプルプログラムで見てみましょう。 1 // throw サンプルプログラム 2 package exception.gaiyou; 3 4 import java.util.Scanner; 5 6 public class ThrowSample { 7 8 public static void main(String[] args) { 9 //外部入力 10 System.out.println("あなたの年齢を入力してください"); 11 Scanner scanner = new Scanner(System.in); 12 int yourAge = scanner.nextInt(); 13 scanner.close(); 14 //メソッド呼び出し 15 try { 16 age(yourAge); 17 } catch(IllegalArgumentException e) { 18 System.out.println("0 以上 120 以下で入力をしてください。"); 19 throw e; 20 } 21 System.out.println("あなたの年齢は、" + yourAge + " 歳です。"); 22 } 23 24 private static void age(int age) throws IllegalArgumentException { 25 System.out.println("-----実行結果-----"); 26 if (age 120) { 27 // mainメソッドから渡った引数の数値が、0 以上120以下かチェック 28 throw new IllegalArgumentException(); 29 } 30 } 31 }あなたの年齢を入力してください 20 -----実行結果----- あなたの年齢は、20 歳です。throw サンプルプログラムでは、年齢確認を行っています。IllegalArgumentExceptionは、不正な引数、または不適切な引数をメソッドに渡したことを示すためにスローされる例外クラスです。ただし、非検査例外のため try-catchをせずともコンパイルエラーは発生しません。しかし、基本的に例外処理は try-catchで囲むか、例外を呼び出し側に投げるかをする必要があります。throw サンプルプログラムでは一般的に考え、年齢は0歳以上120歳以下です。それ以外は、例外となるように設定してあります。もし入力した値が範囲外の場合は、IllegalArgumentException インスタンスが投げられることで「入力値が範囲外のため処理を継続できない」という例外が発生し、throws で呼び出し側に例外がスローされ例外処理されています。もし、0 ~ 120 以外の数値が入力された場合は、どのような結果が出力されるでしょうか?あなたの年齢を入力してください 131 -----実行結果----- 0 以上 120 以下で入力をしてください。 Exception in thread "main" java.lang.IllegalArgumentException at exception.gaiyou.ThrowSample.age(ThrowSample.java:28) at exception.gaiyou.ThrowSample.main(ThrowSample.java:16) 28行目で設定した throw によって、引数で渡ってきた数値が範囲外だったため、例外が発生しています。プログラムの動きは、以下のようになります。(1)12行目 外部入力(2)16行目 ageメソッド呼び出し(3)26行目 mainメソッドから渡った引数の数値が、0 以上120以下かチェック(4)21行目 0 以上120以下であれば、年齢表示         17行目 0 ~ 120 以外の数値であれば、例外が呼び出し側にスローされ例外処理が行われる関連記事:例外の概要、例外クラスについて ‐検査例外・非検査例外など     例外処理(try-catch、try-catch-finally、マルチキャッチ など)どの例外が発生するかについて上記で出てきた FileWriterは、IOExceptionが発生する可能性があるため、例外処理の記述が必須なことは分かりましたね。FileWriter以外にも、いくつかのメソッドやコンストラクタで例外が発生する可能性があります。どのメソッドやコンストラクタを使用すると、どんな例外が発生する可能性があるのかは、JavaDocに書かれています。コンストラクタの詳細 FileWriter public FileWriter(String fileName) throws IOException ファイル名を指定して FileWriter オブジェクトを構築します。 パラメータ: fileName - システムに依存するファイル名の文字列。 例外: IOException - 指定されたファイルが存在するが通常ファイルではなくディレクトリである場合、存在せず作成もできない場合、またはなんらかの理由で開くことができない場合 (JavaDocより引用)上記は、FileWriterコンストラクタの詳細です。もし、使用したいメソッドやコンストラクタの宣言後に「throws 例外クラス」が書かれていると、例外処理の記述が必要となります。例外クラスは、発生する可能性がある例外クラスのことです。例外については、JavaDocを参考にしてみてください。スタックトレース例外が発生した場合、どんな例外なのかが出力されます。その中でも、例外が発生するまでの過程を表示したものを「スタックトレース」と言います。Javaは実行時、メソッド呼び出しなどの命令をメモリのスタック領域に作成します。スタックトレースは、その作成された命令などをリスト化して、例外発生時に表示ができるのです。printStackTrace()printStackTraceは、スタックトレースを標準エラーに出力するメソッドです。上記のスタックトレースで解説した通り、例外が発生するまでの過程をすべて表示できます。また、printStackTraceメソッドは、Java言語のすべてのエラーと例外のスーパー・クラスである、Throwableクラスのメソッドになります。実際にサンプルプログラムで見てみましょう。 1 // printStackTraceメソッドサンプル 2 package exception.gaiyou; 3 4 import java.io.File; 5 import java.io.FileWriter; 6 import java.io.IOException; 7 8 public class PrintStackTraceSample { 9 10 public static void main(String[] args) { 11 try { 12 //呼び出し先メソッド名 13 sample(); 14 //呼び出し先メソッドで例外が発生すると、ここに移行 15 } catch(IOException e) { 16 //スタックトレース出力 17 e.printStackTrace(); 18 } 19 } 20 21 // throws宣言 22 private static void sample() throws IOException { 23 System.out.println("-----実行結果-----"); 24 FileWriter fw = null; 25 // 存在しないパスをわざと設定し、例外発生 26 File file = new File("q:\\Sample\\Hello.txt"); 27 fw = new FileWriter(file); 28 System.out.println("ファイルの作成に成功しました。"); 29 //ファイルの書き込み 30 fw.write("Hello World \n"); 31 fw.write("こんにちは!"); 32 System.out.println("ファイルの書き込みに成功しました。"); 33 //ファイルを閉じる 34 if (fw != null) { 35 fw.close(); 36 System.out.println("正常にファイルを閉じました。"); 37 } 38 } 39 }-----実行結果----- java.io.FileNotFoundException: q:\Sample\Hello.txt (指定されたパスが見つかりません。) at java.base/java.io.FileOutputStream.open0(Native Method) at java.base/java.io.FileOutputStream.open(FileOutputStream.java:298) at java.base/java.io.FileOutputStream.(FileOutputStream.java:237) at java.base/java.io.FileOutputStream.(FileOutputStream.java:187) at java.base/java.io.FileWriter.(FileWriter.java:96) at exception.gaiyou.PrintStackTraceSample.sample(PrintStackTraceSample.java:27) at exception.gaiyou.PrintStackTraceSample.main(PrintStackTraceSample.java:13)上記の実行結果の内容が、スタックトレースです。printStackTraceメソッドサンプルでは、ファイルを作成して書き込みをする、というものです。しかし、指定したドライブが存在しないために例外が発生しています。<スタックトレース例>発生した例外クラス:エラーメッセージ at クラス名.メソッド名(ソース名:行番号) at クラス名.メソッド名(ソース名:行番号) … at クラス名.メソッド名(ソース名:行番号)最初の1行目は、発生した例外のクラス名とエラーメッセージが表示されます。(エラーメッセージがない場合もあります)2行目からは、スタックに作られたプログラムの命令が書かれています。スタックトレースは、新しい命令が来ると、前の命令の上にリストとして表示されるので、プログラム順には下からリスト化されています。メソッド名にが記載されている場合は、コンストラクタを示しています。ソース名に(Native Method)が記載されている場合は、Javaのネイティブメソッド(Java以外の言語で開始されるJavaメソッド)を示しています。では、printStackTraceメソッドサンプルの例外発生の原因解析してみます。1行目では、発生した例外クラスが「java.io.FileNotFoundException」、エラーメッセージが「q:\Sample\Hello.txt (指定されたパスが見つかりません。)」です。FileNotFoundExceptionクラスは、指定されたパス名で示されるファイルが開けなかったことを通知します。今回は、1行目で原因の特定ができます。「q ドライブ」というものは存在していないため、ありえないパスを指定しているので例外が発生しているのです。もしも、原因の特定出来ない場合は、2行目以降の内容を見ていきます。スタックトレースを見ると、Javaプログラムの実行では、多くのクラスやメソッドが用意されており、裏で動いているのがよく分かりますね。スタックトレースを理解できるようになることで、デバッグの効率が飛躍的に上がります。関連記事:例外の概要、例外クラスについて ‐検査例外・非検査例外など     例外処理(try-catch、try-catch-finally、マルチキャッチ など)     java.io.Fileクラスの使い方(ファイル一覧の取得、フィルタ)getMessage()、getCause()printStackTraceメソッドでは、スタックトレースを全文表示することが出来ました。printStackTraceメソッドサンプルでは、スタックトレースは短い物でしたが、もっと長くなることもあります。そのため、もっと簡潔に表示してほしい場合は getMessage()、getCause() を使用します。getMessageメソッド・getCauseメソッドは、Java言語のすべてのエラーと例外のスーパー・クラスである、Throwableクラスのメソッドになります。getMessageメソッドは、エラーメッセージを表示します。getCauseメソッドは、実際に発生した例外を取得できます。サンプルプログラムで見てみましょう。 1 // getMessage、getCauseメソッドサンプル 2 package exception.gaiyou; 3 4 import java.io.File; 5 import java.io.FileWriter; 6 import java.io.IOException; 7 8 public class GetSample { 9 10 public static void main(String[] args) { 11 try { 12 //呼び出し先メソッド名 13 sample(); 14 //呼び出し先メソッドで例外が発生すると、ここに移行 15 } catch(IOException e) { 16 //例外状況のエラーメッセージを出力 17 System.out.println("getMessage:例外状況のエラーメッセージを出力"); 18 System.out.println(e.getMessage()); 19 System.out.println(); 20 //例外の原因クラスを出力 21 System.out.println("getCause:例外の原因を出力"); 22 if (e.getCause() == null) { 23 System.out.println("原因例外なし"); 24 } else { 25 e.getCause().printStackTrace(); 26 } 27 } 28 } 29 30 // throws宣言 31 private static void sample() throws IOException { 32 System.out.println("-----実行結果-----"); 33 FileWriter fw = null; 34 // 存在しないパスをわざと設定し、例外発生 35 File file = new File("q:\\Sample\\Hello.txt"); 36 fw = new FileWriter(file); 37 System.out.println("ファイルの作成に成功しました。"); 38 //ファイルの書き込み 39 fw.write("Hello World \n"); 40 fw.write("こんにちは!"); 41 System.out.println("ファイルの書き込みに成功しました。"); 42 //ファイルを閉じる 43 if (fw != null) { 44 fw.close(); 45 System.out.println("正常にファイルを閉じました。"); 46 } 47 } 48 }-----実行結果----- getMessage:例外状況のエラーメッセージを出力 q:\Sample\Hello.txt (指定されたパスが見つかりません。) getCause:例外の原因を出力 原因例外なしgetMessageメソッドでは、スタックトレースのエラーメッセージが出力されます。getCauseメソッドでは、例外原因の例外クラスを取得しますが、今回のサンプルプログラムは e.getCause() で null が返されるため、実行結果は原因例外なしと出力されます。関連記事:例外の概要、例外クラスについて ‐検査例外・非検査例外など     例外処理(try-catch、try-catch-finally、マルチキャッチ など)     java.io.Fileクラスの使い方(ファイル一覧の取得、フィルタ)まとめ例外制御の throws、throw の使い方は分かりましたか? 例外制御には、他にも try-catch、マルチキャッチなどもありますので、関連記事から一読していただくと、例外への理解がより深まるでしょう。関連記事:例外の概要、例外クラスについて ‐Exception、RuntimeException、Errorなど     例外制御(try-catch、try-catch-finally、マルチキャッチ など)     try - with - resources 構文     独自例外クラス

【Java】StringBufferクラスとStringBuilderクラスの文字列操作

【Java】StringBufferクラスとStringBuilderクラスの文字列操作

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者にも✅、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!文字列を扱う3つのクラス【java.langパッケージ】java.langパッケージの文字列を扱うクラスにはStringクラス、StringBufferクラス、StringBuilderクラスの3つがあります。Stringクラスについては以下リンクの記事で紹介しています。参考記事リンク:【Java】Stringクラスの文字列比較・判定・検索        【Java】StringBufferクラスとStringBuilderクラスの文字列操作        【Java】MessageFormatクラスでの文字列置換        【Java】Stringクラスformatメソッドの文字列整形とエスケープシーケンス        【Java】Java8 以降に追加された文字列結合(StringクラスjoinメソッドとStringjonerクラス)        【Java】"サロゲートペア"を包含する文字列の操作        【Java】文字列・正規表現- StringBuilderクラスとStringBufferクラスを知ろうなぜ、StringBuilderクラスとStringBufferクラスが用意されているのでしょうか。これら2つのクラスと、Stringクラスの違いは、変数に格納した文字列を変更できる点です。Stringクラスでは、変数に文字列を格納した後は変更できません。しかし、StringBuilderクラスとStringBufferクラスは変数に文字列を格納した後でも文字列の内容や長さを特定のメソッドの呼出しにより変更可能になっています。Stringクラスでも+(プラス)演算子やconcatメソッドを使うことで文字列の連結が可能です。しかし、連結の際に毎回新しいオブジェクトを生成することになるため処理コストが高く処理に時間がかかる場合があります。StringBuilderクラス、StringBufferクラスでの文字列操作は、新しいオブジェクトの生成は行わず、バッファ内(データの保存場所)で文字列を操作するためStringクラスよりも処理コストが低くなります。(繰り返し処理などで、文字列の連結が複数回行われる場合などは、処理速度の差が顕著になります。)これら2つのクラスは、可変な文字列に対応するために用意されているということです!StringBufferクラスがjava1.0で導入され、StringBuilderクラスはJava1.5で導入されました。- StringBuilderクラスとStringBufferクラスの違いを知ろうJavadocでは以下のように説明があります。StringBuffer スレッドセーフな可変の文字列です。StringBuilder 文字の可変シーケンスです。スレッドセーフ thread safety 参照:javadoc-StringBuilder/javadoc-StringBufferあるコンピュータプログラムを複数のスレッドで並行して実行していても、問題が生じない仕様や設計になっていること。つまり、StringBufferクラスはマルチスレッド(並列処理)に対応したクラス、StringBilderクラスはシングルスレッド(直列処理)に適したクラスということになります。複数のスレッドで使用する際にStringBufferクラスは安全に使用することができます。一方で複数の処理を並行して進めることが必要がない場合、StringBufferクラスのままでは不必要な処理コストがかかってしまいます。このようなシングルスレッド(直列処理)の場合はStringBuilderクラスを使う方が適しています。StringBuilderクラス・StringBufferクラスの基本的な操作今回の記事で紹介する操作はStringBuilderクラス、StringBufferクラスのどちらでも使用することができます。- 初期化と代入についてStringBuilder変数名= new StringBuilder() StringBuffer 変数名= new StringBuffer()両者のクラスも同じように初期化(インスタンス化)を行えます。初期容量が16文字である空の文字列ビルダーを構築します。初期化の際に引数を以下のように指定することもできます。String:指定された文字列の内容に初期化された文字列ビルダーを構築します。int:capacity引数によって指定された初期容量がある空の文字列ビルダーを構築します。StringBuilder変数名= new StringBuilder(String str)StringBuilder変数名= new StringBuilder(int capacity)※StringBufferも同様です。この記事では、基本的な操作のappendメソッド・insertメソッドに加えて、その他の操作もいくつか紹介します。append:文字列の連結、追加などの処理を行う時に使います。insert:同じ文字列に対して挿入を行う場合に使います。delete:指定した範囲の文字列を削除する操作です。replace:指定した範囲に文字列を置き換えられる操作です。reverse:文字列の順序を逆に置き換えられる操作です。substring:文字列内のある部分だけを使用したときに使います。indexOf:文字列内のある部分の最初のインデックスを知りたい時に使います。Stringオブジェクトの生成法:StringBuilder・StringBufferをStringオブジェクトに変更する操作です。今回はすべてStringBuilderクラスを利用した紹介になります。- appendメソッドStringBuilder append(String str)引数のデータをStringBuilder文字列に追加できます。引数には様々な種類のデータを受け取ることができるようにオーバーロードされています。【boolean char char[] double float int long Object String StringBuffer】Stringクラスでも「+」(プラス演算子)や「concatメソッド」を使って文字列の連結が可能です。しかし毎回新しいインスタンスを生成することになるため、処理に時間が掛かってしまいます。StringBuilderクラス、StringBufferクラスを使う事でこの問題を解決することができます。以下の例ではString変数を追加しています。public class Test { public static void main(String[ ] args) { StringBuilder s=new StringBuilder("名前は"); s.append("サトウです。"); System.out.println(s); } }出力結果名前はサトウです。Stringクラスを使用した連結の例と比較してみましょう。public class Test { public static void main(String[ ] args) { String s="名前は"; String t=s.concat("サトウです。"); System.out.println(s); System.out.println(t); } }出力結果名前は 名前はサトウです。Stringクラスを利用すると、文字列を結合する度に新しいオブジェクトが生成されるため処理コストが高くなります。StringBuilderクラスは、StringBuilderオブジェクト(変数s)を持つバッファ内で文字列を操作するため、新しいオブジェクトを生成する必要がなく、処理コストを抑える事ができます。上の例では少ない処理を扱っていますが、膨大な処理の場合はStringBuilderクラスを利用した方が良いことがわかると思います!Stringクラスの文字列連結は以下の記事で紹介しています。参考:【Java】Stringクラスについての理解と基本的な文字列操作- insertメソッドStringBuilder insert(int offset, String str)第一引数で指定した位置に、第二引数に指定したデータを挿入できます。(offsetは「埋め合わせる」という意味で使われています。数値はインデックスの値を入れます。)第二引数には様々な種類のデータを受け取ることができるようにオーバーロードされています。【boolean char char[] double float int long Object String StringBuffer】以下の例ではappendメソッドで使用した例をそのまま使って文字列の挿入を行っています。appedメソッドの前に、insertメソッドを使用して、”の読み方”という文字列を挿入してます。public class Test { public static void main(String[ ] args) { StringBuilder s=new StringBuilder("名前は"); //追加 s.insert(2,"の読み方"); s.append("サトウです。"); System.out.println(s); } }出力結果名前の読み方はサトウです。インデックス[2]を指定したので "名前" と "は" の間に "の読み方" が挿入されています。そのあとにappendメソッドで"サトウです。"が追加されているのがわかると思います。第一引数に文字数以上のインデックスを指定すると例外が発生します。public class Test { public static void main(String[ ] args) { StringBuilder s=new StringBuilder("名前は"); s.insert(4,"の読み方"); System.out.println(s); } } Exception in thread "main" java.lang.StringIndexOutOfBoundsException: offset 4,length 3注意しましょう。- deleteメソッドStringBuilder delete(int beginIndex, int endIndex)指定されたインデックスの範囲の文字列を削除します。引数に削除する文字列の開始位置(beginIndex)と終了位置(endIndex)を指定します。削除の対象となるのは、「beginIndexからendIndex-1」の範囲であることを覚えておきましょう!deleteメソッドを使用して文字列の削除する例を見てみましょう。今回は"いいこっか"(いい国家)というString文字列を格納してStingBuilderオブジェクトを生成しました。 .い .い .こ .っ .か ↑   ↑  ↑  ↑  ↑   0  1   2   3   4  インデックス1~4の範囲の文字列を削除します。public class Test { public static void main(String[ ] args) { StringBuilder s=new StringBuilder("いいこっか"); s.delete(1,4); System.out.println(s); } }出力結果いかインデックス1~4の範囲の文字列が削除され、「いか」のみが残りました。- replaceメソッドStringBuilder replace(int beginIndex, int endIndex, String str)このメソッドはインデックスで指定した範囲の文字列を、第三引数で指定した文字列に置き換えます。第一、第二引数には置き換える文字列の開始位置(beginIndex)と終了位置(endIndex)を指定します。置き換えの対象となるのは、「beginIndexからendIndex-1」の範囲であることを覚えておきましょう!deleteメソッドと同じ例を用いて、replaceメソッドで文字列を置き換えましょう。 .い .い .こ .っ .か     .い  .ぶ  .ん  .か   ↑   ↑  ↑  ↑  ↑  ⇔  ↑   ↑   ↑   ↑    0  1   2   3   4          0  1   2    3     インデックス1~4の範囲の文字列を指定した文字列で置き換えます。public class Test { public static void main(String[ ] args) { StringBuilder s=new StringBuilder("いいこっか"); s.replace(1,4,"ぶん"); System.out.println(s); } }出力結果いぶんかインデックス1~4の範囲 "いこっ" が指定した文字列 "ぶん" に置き換わっています。StringBuilderクラスのreplaceメソッドでは、第二引数に文字数以上の値を指定しても例外が発生しません。Stringクラスのreplaceメソッドの場合は例外が発生してしまいます。Stringクラスの置換/replaceメソッドは以下の記事で紹介しています。参考:【Java】Stringクラスについての理解と基本的な文字列操作- reverseメソッドStringBuilder reverse()このメソッドは、文字列の順序を逆に置き換えることができます。引数を指定する必要はありません。 .い .い .こ .っ .か     .か .っ .こ .い .い ↑  ↑  ↑  ↑  ↑  ⇔  ↑  ↑  ↑  ↑  ↑   0   1   2   3   4          0   1   2    3   4 今回も同様の例を用いて、reverseメソッドで文字列の順序を逆に置き換える例を見てみましょう。public class Test { public static void main(String[ ] args) { StringBuilder s=new StringBuilder("いいこっか");          s.reverse(); System.out.println(s); } }出力結果かっこいい- substirngメソッドSubstirngメソッドは文字列の中から指定した部分の文字列を切り出すことができます。文字列を切り出す場合はインデックス(文字の位置)を指定する必要があります。Stringクラスのsubstringメソッドは以下の記事で紹介しています。(インデックスの考え方についても記述してあります。)参考:【Java】Stringクラスについての理解と基本的な文字列操作開始位置を指定した切り出しString substring(int beginIndex)開始位置を指定する切り出しの場合は引数に開始位置のインデックス(beginIndex)を指定します。今回は、4番目を開始位置に指定します。  .い .い .こ .っ .か ↑  ↑  ↑  ↑  ↑   0   1   2   3   4  4番目の.(ピリオド)以降の文字列が切り出されます。public class Test{ public static void main(String[] args){ StringBuilder s=new StringBuilder("いいこっか"); System.out.println(s); System.out.println("切り出し:"+s.substring(4)); } }出力結果いいこっか 切り出し:か4番目に開始位置を指定したので、「か」が切り出されました。範囲を指定した切り出しString substring(int beginIndex,int endIndex)範囲を指定する切り出しの場合は第一引数に開始位置のインデックス(beginIndex)第二引数に終了位置のインデックス(endIndex)を指定します。今回は2番目から5番目までの範囲を指定します。  .い .い .こ .っ .か . ↑  ↑  ↑  ↑  ↑  ↑   0   1   2   3   4  5 範囲を指定するとき際に注意するのはインデックスの範囲の取り方です。文字ではなく、文字の前にある.(ピリオド)の範囲を取るので覚えておきましょう!( StringBuilderクラスでは文字数までを範囲にすることができます。)public class Test{  public static void main(String[] args) { StringBuilder s=new StringBuilder("いいこっか"); System.out.println(s); System.out.println("切り出し:"+s.substring(2,5)); } }出力結果いいこっか 切り出し:こっか範囲を指定した「こっか」が切り出されました。- indexOfメソッドint indexOf(String str)indexOfメソッドは、引数に指定された部分文字列(String str)が最初に出現する位置のインデックスをint型で返します。  .い .い .こ .っ .か . ↑  ↑  ↑  ↑  ↑  ↑   0   1   2   3   4  5 今回は引数を "こっか" にしてindexOfメソッドを使ってみましょう!public class Test { public static void main(String[ ] args) { StringBuilder s= new StringBuilder("いいこっか"); int i=s.indexOf("こっか"); System.out.println(i); } }出力結果2StringクラスにもindexOfメソッドが用意されています。以下の記事で紹介しています。参考:【Java】Stringクラスの文字列比較・判定・検索Stringオブジェクトの生成法StringBuilder・StringBufferをStringオブジェクトに変更する操作を紹介します。- Stringクラスのコンストラクタを利用した方法String String(StringBuilder builder)String String(StringBuffer buffer)引数に指定された、StringBuilderまたはStringBufferオブジェクトを使って、新しいStringオブジェクトを生成します。例をみてみましょう。public class Test { public static void main(String[ ] args) { StringBuilder s= new StringBuilder("いいこっか"); //コンストラクタの生成 String str = new String(s); System.out.println(str); } }出力結果いいこっか新しく生成されたStringオブジェクト「str」に、StringBuilder「s」の値が格納されている事が確認できます。- toStringメソッドを利用した方法String toString()StringBuilderクラス、StringBufferクラスにはtoStringメソッドが用意されています。StringBuilder・StringBufferオブジェクトをStringオブジェクトに変換します。例を見てみましょう。public class Test { public static void main(String[ ] args) { StringBuilder s= new StringBuilder("いいこっか"); String t= s.toString(); System.out.println(t); } }出力結果いいこっかStringBilderオブジェクトが、toStringメソッドによってString変数(t)へ格納ができるようになっています。

【Java】Stringクラスについての理解と基本的な文字列操作

【Java】Stringクラスについての理解と基本的な文字列操作

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!StringとはそもそもStringとは何なのでしょうか。今まで学習した基本データ型とは異なるデータ型です。Stringの疑問を紐解いていきましょう。- Stringの使い方String型は今まで学習した基本データ型とは異なる特殊なデータ型です。ですが、変数を格納するだけなら他のデータ型と同じように扱うことができます。””(ダブルクォーテーション)で囲まれた文字を表示することができます。String 変数="文字列"サンプルコードpublic class Test{ public static void main(String[] args) { String s="Stringを理解する!!"; System.out.println(s); } }出力結果Stringを理解する!!- Stringは文字列を扱うクラスであるなぜStringは特殊なのでしょうか。それはStringが文字列を扱うクラスだからです。String型はStringクラスで定義されています。String型はクラス型変数なのです。本来、このようなクラス型変数のオブジェクトを利用する際は、クラスをimportして、インスタンス化しなければいけません。しかしStringクラスに関しては、importなしで使うことができるようになっていることに加えて、new演算子を使ったインスタンス化をしなくても、変数の初期化と代入ができるようになっています!""(ダブルクォーテーション)で囲われた文字列を「文字列リテラル」と言いますが、この文字列リテラルとして記述された文字列はStringクラスのオブジェクトとして扱われます。従って、初期化(インスタンス化)されていないString型の変数に対して、""(ダブルクォーテーション)で囲われた文字列を直接代入する事が可能となっています。(文字列リテラルとしてインスタンス化されたStringオブジェクトを新しい変数に代入している)String s="Stringを理解する!!";Stringクラスはjava.langパッケージに含まれています。java.langパッケージはJavaプログラミングにおける必須的なクラスが入っているパッケージです。なので最初から、パッケージごとimportされており、Stringを使うことができるようになっているようです。データ型の中で、String型だけが大文字「S」なのも、クラスであるとわかると納得できますね。また他のクラスと同様にStringクラスにも様々なメソッドが用意されています。文字列を操作するメソッドが含まれています。- Stringを操作しよう実際にStringを使って文字列を操作してみましょう。Stringクラスでは様々なメソッドが用意されています。ここでは基本的な7つの操作を紹介します。連結 :2つ以上の文字列を繋ぎたい時に使います。切り出し:文字列内のある部分だけを使用したときに使います。文字列の長さの表示:文字列の数によって、処理を分岐させたい時などに使います。分割:CSVファイルなど固定の文字で区切られた文字列を分割したい時などに使用します。変換(大文字・小文字):大文字、小文字を無視して比較したい時などに使用します。置換:文字列に対して修正したい箇所が多い時などに使うと便利です。空白削除:文字列の前後の半角・全角スペースといった空白文字を消し処理をしやすくするのに役立ちます。比較・判断・検索の操作等、その他のStringについては以下の記事で紹介しています。参考記事リンク:【Java】Stringクラスの文字列比較・判定・検索        【Java】StringBufferクラスとStringBuilderクラスの文字列操作        【Java】MessageFormatクラスでの文字列置換        【Java】Stringクラスformatメソッドの文字列整形とエスケープシーケンス        【Java】Java8 以降に追加された文字列結合(StringクラスjoinメソッドとStringjonerクラス)        【Java】"サロゲートペア"を包含する文字列の操作        【Java】文字列・正規表現連結文字列の連結とは、複数の文字列を繋ぎ合わせ、一つの文字列にする処理のことを指します。①プラス演算子(+)を利用した連結、②concatメソッドを利用した連結、③StringBuilderクラスのappendメソッドを利用した連結、の3つを紹介します。- プラス演算子(+)プラス演算子を使えば文字列同士の連結が簡単にできます。今回は変数sと変数tを連結しましょう。public class Test{ public static void main(String[] args) { String s="おはようございます。"; String t="どうぞよろしくお願いします。"; System.out.println(s+t); } }これを実行すると、おはようございます。どうぞよろしくお願いいたします。「おはよう。」と「どうぞよろしくお願いいたします。」が連結されました。- concatメソッドString concat(String)Stringクラスのconcatメソッドを利用すると、文字列の後ろに別の文字列を連結することができます。内部の処理構造の違いにより、プラス演算子よりconcatメソッドの方が少しだけ処理が速くなります。今回は変数sの後ろに変数tを連結させ、変数uという新しいStringオブジェクトを生成します。public class Test{ public static void main(String[] args) { String s="こんにちは。"; String t="どうぞよろしくお願いいたします。"; String u=s.concat(t); System.out.println(u); } }実行すると、こんにちは。どうぞよろしくお願いいたします。「こんにちは。」と「どうぞよろしくお願いします」が連結されました。◆StringBuilderクラスのappendメソッドプラス演算子やStringクラスでも文字列連結はできますが、膨大な数の文字列を結合させると、非常に時間が掛かってしまう場合があります。そのような時は、StringBuilderクラスのappendメソッドを積極的に使いましょう。文字列連結を多用した変数への格納や、for文などの繰り返し処理で連結を使用する場合など、プラス演算子やconcatメソッドよりも高速に処理する事ができます。StringBuilderクラスについてはリンク先の記事で紹介します。参考記事リンク:【Java】StringBufferクラスとStringBuilderクラス切り出し切り出しとは、文字列の中から指定した部分の文字列を抽出することを指します。Stringクラスを使って文字列の一部を切り出す場合は、substringメソッド、charAtメソッドを使います。①開始位置を指定する切り出し/substringメソッド②範囲を指定する切り出し/substringメソッド③1つの文字の切り出し/chatAtメソッド④切り出しの例外の4つを紹介します。文字列を切り出す場合はインデックス(文字の位置)を指定する必要があります。以下の例を見ながらインデックスについて確認しましょう。  .い .ろ .は .に .ほ .へ .と ↑  ↑  ↑  ↑  ↑  ↑  ↑  0   1   2   3   4   5   6文字の前に振られている.(ピリオド)がインデックスだと思ってください。インデックスは「0」から始まるので注意しましょう。- 開始位置を指定した切り出し/substringメソッドString substring(int beginIndex)開始位置を指定する切り出しの場合は引数に開始位置のインデックス(beginIndex)を指定します。今回は、4番目を開始位置に指定します。  .い .ろ .は .に .ほ .へ .と ↑  ↑  ↑  ↑  ↑  ↑  ↑  0   1   2   3   4   5   64番目の.(ピリオド)以降の文字列が切り出されます。public class Test{ public static void main(String[] args){ String s="いろはにほへと"; System.out.println(s); System.out.println("切り出し:"+s.substring(4)); } }実行するといろはにほへと 切り出し:ほへと4番目に開始位置を指定したので、「ほへと」が切り出されました。- 範囲を指定した切り出し/substringメソッドString substring(int beginIndex,int endIndex)範囲を指定する切り出しの場合は第一引数に開始位置のインデックス(beginIndex)、第二引数に終了位置のインデックス(endIndex)を指定します。今回は2番目から5番目までの範囲を指定します。  .い .ろ .は .に .ほ .へ .と ↑  ↑  ↑  ↑  ↑  ↑  ↑  0   1   2   3   4   5   6範囲を指定するとき際に注意するのはインデックスの範囲の取り方です。文字ではなく、文字の前にある.(ピリオド)の範囲を取るので覚えておきましょう!( endIndex-1 までが範囲になるということ!)public class Test{  public static void main(String[] args) { String s="いろはにほへと"; System.out.println(s); System.out.println("切り出し:"+s.substring(2,5)); } }実行するといろはにほへと 切り出し:はにほ範囲を指定した「はにほ」が切り出されました。- 1つの文字の切り出し/chatAtメソッドString charAt(int Index)1つの文字を取得したいといった場合は、charAtメソッドを使います。指定したインデックスの一文字を切り出すことができます。今回は、3番目を切り抜きます。  .い .ろ .は .に .ほ .へ .と ↑  ↑  ↑  ↑  ↑  ↑  ↑  0   1   2   3   4   5   6public class Test{ public static void main(String[] args) { String s="いろはにほへと"; System.out.println(s); System.out.println("切り出し:"+s.charAt(3)); } }実行するといろはにほへと 切り出し:に3番目の一文字だけを切り出すことができました。- 切り出しの例外substringメソッド、charAtメソッドを使用して、文字列の切り出しを行う場合、文字数以上のインデックスを指定すると例外が発生するので注意しましょう!サンプルコードpublic class Test { public static void main(String[] args) { String s="いろはにほへと"; System.out.println("substring:"+s.substring(2,8)); System.out.println("charAt:"+s.charAt(9)); } }「いろはにほへと」の文字数は7文字なので、インデックスを「8」以上指定すると出力結果は以下のようになります。Exception in thread "main" java.lang.StringIndexOutOfBoundsException: begin 2, end 8, length 7例外が確認できました。StringIndexOutOfBoundsException は、インデックスが負または文字列のサイズより大きい場合に発生するExceptionです。文字列の長さの表示文字列の長さはバイト数ではなく文字数のことを指しています。- lengthメソッドint length()文字数(文字列の長さ)を取得するには、Stringクラスのlengthメソッドを使います。Stringの変数にlengthメソッドを以下のように使いましょう。public class Test{ public static void main(String[] args) { String s="あいうえお"; String t="abcdefghijk"; String u="0300000000"; System.out.println("文字数:"+s.length()); System.out.println("文字数:"+t.length()); System.out.println("文字数:"+u.length()); } }実行すると文字数:5 文字数:11 文字数:10文字数をそれぞれ取得することができました。ちなみにバイト数は以下の書き方で表示できます。"文字列".getBytes().length覚えておくと便利です!分割Stringクラスを使って文字列を分割するにはsplitメソッドを使います。①第一引数のみを指定する方法②第二引数までを指定する方法の二つを紹介します。そもそも分割とは具体的にどのような操作なのでしょうか。以下の例を見てイメージをつかみましょう。例えば、以下のようなStringオブジェクトではString city= "札幌、仙台、名古屋、福岡";変数city(”札幌、仙台、名古屋、福岡”)は、まとまった一つの文字列です。そのため、このままでは「仙台」や「福岡」などそれぞれの要素を分けて扱うことができない状態です。それを解消し、「札幌」、「仙台」など一つのデータとして運用できるようにすることが、「分割」という操作になります。- 第一引数のみを指定する分割/splitメソッドString[] split(String regex)第一引数のみを指定する場合は、引数に「文字列」あるいは「正規表現」を使うことができます。(引数名regexとは、regular expression[正規表現]の省略語です。)String文字列を引数の指定ごとに分割し、String配列に格納します。戻り値はString配列型になるので注意しましょう。正規表現について下記のリンク先記事で紹介しています。参考記事リンク:【Java】文字列・正規表現今回は引数に文字列の読点(、)を指定して使用しています。public class Test{ pubic static void main(String[] args) { String city = "札幌、仙台、名古屋、福岡"; String[] cities = city.split("、"); System.out.println("配列の中身"+Arrays.toString(cities)); System.out.println(cities[2]); } }実行すると配列の中身[札幌, 仙台, 名古屋, 福岡] 名古屋String文字列が四つに分割されてString配列になっています。また配列[2]を取り出すと、分割された”名古屋”をきちんと取り出すことができますね。- 第二引数まで指定する分割/splitメソッドString[] split(String regex,int limit)第二引数までを指定する方法は、分割の数を意図的に制限することができます。int型で分割する数を指定します。今回は上の例に習って、第二引数を「3」に指定して、分割を制限してみましょう。public class Test{ pubic static void main(String[] args) { String city = "札幌、仙台、名古屋、福岡"; [] cities = city.split("、",3); System.out.println("配列の中身"+Arrays.toString(cities)); System.out.println(cities[2]); } }実行すると、配列の中身[札幌, 仙台, 名古屋、福岡] 名古屋、福岡カンマ(,)と訓点(、)が混在してわかりにくいかもしれませんが、配列の中身は ①札幌 ②仙台 ③名古屋、福岡 という様に3つに分割されて配列に格納されています。また、配列の要素[2]を取り出すと、「名古屋、福岡」の分割されていないひとまとまりの文字列が取り出されます。変換(大文字・小文字)- toUpperCaseメソッド/toLowerCaseメソッドString toUpperCase() String toLowerCase()Stringクラスには、文字列の大文字または小文字に変換するためのメソッドがあります。大文字への変換は「toUpperCaseメソッド」・小文字への変換は「toLowerCaseメソッド」を使います。このメソッドは「半角文字」の変換をします。「全角文字」は適用できないので注意しましょう!今回は同じ変数sを使って、それぞれのメソッドを使用してみましょう。public class Test{ public static void main(String[] args) { String s = "TokyoITCollege"; System.out.println("通常:"+s); System.out.println("toUpper:"+s.toUpperCase()); System.out.println("toLower:"+s.toLowerCase()); } }実行すると通常:TokyoITCollege toUpper:TOKYOITCOLLEGE toLower:tokyoitcollegetoUpperCaseメソッドはすべて大文字に、toLowerCaseメソッドはすべて小文字になりました。置換Stringクラスには、文字列を置き換えるメソッドが3つあります。①replaceメソッドの利用②replaceAllメソッドの利用③replaceFirstメソッドの利用- replaceメソッドString replace(置換される文字列, 置換する文字列)replaceメソッドは第一引数で指定した文字列を第二引数で指定した文字列に置き換えることができます。指定された第一引数に合致するもの全てが置き換わるので覚えておきましょう。今回は、「福岡」を『京都』に置き換えます。文字列に「福岡」が2個含まれていますが、どちらも『京都』に置き換わりますよ。 public class Test{ public static void main(String[] args) { String city = "札幌、仙台、名古屋、福岡、福岡"; System.out.println(city.replace("福岡", "京都")); } }実行すると札幌、仙台、名古屋、京都、京都「福岡」が『京都』へ置き換わったことがわかると思います。- replaceAllメソッドString replaceAll(置換される文字列, 置換する文字列)replaceAllメソッドもreplaceメソッド同様に第一引数で指定した文字列を第二引数で指定した文字列に置き換えることができます。replaceAllメソッドは第一引数に正規表現を使用することができる点で、replaceメソッドと差別化できます。replaceメソッドのサンプルコードは正規表現についての記事で紹介しています。参考記事リンク:【Java】文字列・正規表現- replaceFirstメソッドString replaceFirst(置換される文字列, 置換する文字列)最後はreplaceFirstメソッドです。第一引数を第二引数の文字列に置き換えることは同じです。上記2つのメソッドと異なる点は、最初に合致した文字列に置換を適用する点です。また、replaceAllメソッドと同じ様に、第一引数に正規表現を使用することができます。replaceメソッドと同じ例を使って、replaceFirstメソッドを使ってみましょう。「福岡」が文字列内に2つありますが、今回は最初の「福岡」だけが『京都』に置き換わります。public class Test{ public static void main(String[] args) { String city = "札幌、仙台、名古屋、福岡、福岡"; System.out.println(city.replaceFirst("福岡", "京都")); } }実行すると札幌、仙台、名古屋、京都、福岡となります。最初の「福岡」のみが、『京都』へ置き換えられました。今回の都市データの例は、replaceFirstメソッドを使用した方が適切です。空白除去文字列から空白を削除する方法を紹介します。Stringクラスのtrimメソッドを使う方法と、先に紹介したreplaceメソッドを使って空白削除できる方法の合わせて2つ紹介します。- trimメソッドString trim()文字列の前後から空白を削除するにはtrimメソッドを使います。このメソッドを使うことで、文字列の先頭と末尾の空白と制御文字をすべて削除できます。文字と文字の間の空白は削除できないので注意しましょう。Stringで取得されている変数sの前後には空白があります。”    Tokyo IT College          ” ↑削除する    ↑削除不可  ↑削除する今回は、これをtrimメソッドで削除します。public class Test{ public static void main(String[] args) { String s = " Tokyo IT College "; System.out.println("通常:"+s); System.out.println("削除後:"+s.trim()); } }実行すると通常: Tokyo IT College 削除後:Tokyo IT College「通常」の場合だと文字列の前後に空白がありますが、trimメソッドを使用した後は空白を消すことができています。- replaceメソッド(空白削除)String replace(置換される文字列, 置換する文字列)replaceメソッドの引数に空欄を指定することで、空白削除を行う方法もあります。replace(" ","")第一引数には”  ”(空白)を指定し、第二引数は””ダブルクォーテーションのみにします。public class Test{ public static void main(String[] args) { String s = " Tokyo IT College "; System.out.println("通常:"+s); System.out.println("削除後:"+s.replace(" ","")); } }実行すると通常: Tokyo IT College 削除後:TokyoITCollegereplaceメソッドは、trimメソッドとは異なり、文字間の間の空白もすべて削除してくれます。

【Java】Stringクラスformatメソッドの文字列整形とエスケープシーケンス

【Java】Stringクラスformatメソッドの文字列整形とエスケープシーケンス

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!Stringクラスformatメソッドの文字列整形【java.utilパッケージ】Formatterクラスformatメソッド引数の値を任意の書式に編集して、文字列内に置き換えることができるのがformatメソッドです。Formatter format(Locale l,書式文字列, Object...)Formatter format(書式文字列, Object... )書式指示子を含んだ文字列(書式文字列)を引数に指定します。指示子の構成によって任意の書式を指定します。書式指示子についての詳細は下記(目次参照)に掲載しています。まずはformatメソッドの使い方のイメージを掴みましょう。◆実装例import java.util.Formatter; public class Test { public static void main(String[] args) { Formatter fm = new Formatter(); fm.format("HELLO %S", "format"); System.out.println(fm); } }◆出力結果HELLO FORMAT①java.langパッケージStringクラスに実装されているformatメソッド②java.ioパッケージPrintStreamクラスに実装されているformatメソッド③java.ioパッケージPrintWriterクラスに実装されているformatメソッド④System.out.printf()も内部ではFormatterクラスのインスタンスメソッドを呼び出しています。実は同じような文字列整形が可能です。String String.format(書式文字列, Object...)System.out.printf(書式文字列, Object...)◆①と④の実装例public class Test { public static void main(String[] args) { String s = String.format("GOOD %S", "format"); System.out.println(s); System.out.printf("GREAT %S", "format"); } }◆出力結果GOOD FORMAT GREAT FORMAT本記事で紹介しているFormatメソッドは指示子の構成によって引数を任意の書式へ編集し文字列に組み込むことができる点でjava.textパッケージMessageFormatクラスに実装されているformatメソッドと異なります。参考リンク:【Java】MessageFormatクラスでの文字列置換★以下の説明からString.formatメソッドを使用して解説していきます。書式指示子の構成要素一般(文字、数値型など)の書式指示子では、次の構文が使用されます。% [argument_index+$] [flags] [width] [.precision] conversion書式指示子に指定されている書式を確認しましょう。今回は例として、全ての要素を使用したこちらの書式指示子を使います。[%1$08.2f]の書式指示子は、0埋め(flags)/最小文字数’8’(width)/小数第2位まで表示(precision)の書式が指定されています。引数リストの第一引数(1$)である’1234.5678’が、これらの指定書式に変換され、文字列整形されます。◆実装例public class Test { public static void main(String[] args) { String s = String.format("文字列整形:%1$08.2f", 1234.5678); System.out.println(s); } }◆出力結果文字列整形:01234.57要素の書式と主な使い方前項の例のように値を任意の書式に変換して文字列整形することがformatメソッドでは可能になります。ここでは要素の書き方(書式)と主な使い方を紹介します。argument_index+$conversion(値の型)- 文字列- 数値- True&False- 日時/時刻frags(出力形式)- 左寄せ/右寄せ- カンマ区切り- 0埋めwidth(最小文字数)とprecision(桁数)浮動小数点は小数第6位までをデフォルトで表示します。public class Test { public static void main(String[] args) { String s = String.format("10進数[%1$d]8進数[%1$o]16進数[%1$x]浮動小数点[%2$f]", 12345,1.2345); System.out.println(s); } }出力結果10進数[12345]8進数[30071]16進数[3039]浮動小数点[1.234500]- True&False(b,B)引数にnullが指定されている場合はfalseになります。public class Test { public static void main(String[] args) { String s = String.format("①[%1$b]②[%1$B]③[%2$B]④[%3$b]",true,false,null); System.out.println(s); } }出力結果①[true]②[TRUE]③[FALSE]④[false]- 日付/時刻(t,T)日付/時刻を指定したい時は「%t」または「%T」が接頭辞になります。後に以下の書式を指定する必要があります。下記では日付時刻を文字列にフォーマットするformatメソッドの主な使い方を紹介しています。日付時刻に関して詳しく知りたい方はリンク先を参考にしてください。参考:【Java】日付取得(新API-Java8)   【Java】日付時刻(新API‐Java8) - 日時比較・日時演算    【Java】日付時刻(新API‐Java8) - フォーマット   【Java】日付時刻(新旧 API 相互変換)   【Java】日時取得(従来API)-java.util.Date, java.util.Calendar   【Java】日付時刻(従来のAPI) - 操作(計算、比較、フォーマット)   【Java】日付時刻のまとめimport java.time.LocalDate; import java.util.Date; public class Test { public static void main(String[] args) { //Dateクラスを使った日付時刻取得(旧API) Date date = new Date(); String s = String.format("①%tY年/%ty年②%tm月③%td日/%te日" +"%n"//行区切り文字 +"④%tB/%tb⑤%tA/%ta⑥%tj", date,date,date,date,date, date,date,date,date,date); System.out.println(s); //java.timeパッケージ日付時刻取得(DateAndTime API-Java8) String t = String.format("1⃣%tY年/%ty年2⃣%tm月3⃣%td日/%te日" +"%n" +"4⃣%tB/%tb5⃣%tA/%ta6⃣%tj", LocalDate.now(),LocalDate.now(),LocalDate.now(), LocalDate.now(),LocalDate.now(),LocalDate.now(), LocalDate.now(),LocalDate.now(),LocalDate.now(), LocalDate.now()); System.out.println(t); } }出力結果①2020年/20年②08月③01日/1日 ④8月/8月⑤土曜日/土⑥214日 1⃣2020年/20年2⃣08月3⃣01日/1日 4⃣8月/8月5⃣土曜日/土6⃣214日public class Test { public static void main(String[] args) { //Dateクラスを使った日付時刻取得(旧API) Date date = new Date(); String s = String.format("①%tH時/%tI時②%tk時/%tl時③%tM分%tS秒%tL" +"%n"//行区切り文字 +"④%tp", date,date,date,date,date, date,date,date,date,date); System.out.println(s); //java.timeパッケージ日付時刻取得(DateAndTime API-Java8) String t = String.format("1⃣%tH時/%tI時2⃣%tk時/%tl時3⃣%tM分%tS秒%tL" +"%n" +"4⃣%tp", LocalTime.now(),LocalTime.now(),LocalTime.now(), LocalTime.now(),LocalTime.now(),LocalTime.now(), LocalTime.now(),LocalTime.now(),LocalTime.now(), LocalTime.now()); System.out.println(t); } }出力結果①16時/04時②16時/4時③35分09秒438 ④午後 1⃣16時/04時2⃣16時/4時3⃣35分09秒564 4⃣午後import java.time.LocalDate; import java.time.LocalTime; import java.time.ZonedDateTime; import java.util.Date; public class Test { public static void main(String[] args) { //Dateクラスを使った日付時刻取得(旧API) Date date = new Date(); String s = String.format("①%tR②%tT③%tr④%tD%n⑤%tF⑥%tc", date,date,date,date,date,date); System.out.println(s); //java.timeパッケージ日付時刻取得(DateAndTime API-Java8) String t = String.format("1⃣%tR2⃣%tT3⃣%tr4⃣%tD3%n5⃣%tF6⃣%tc", LocalTime.now(),LocalTime.now(),LocalTime.now(), LocalDate.now(),LocalDate.now(),ZonedDateTime.now()); System.out.println(t); } }出力結果①16:51②16:51:19③04:51:19 午後④08/17/20 ⑤2020-08-17⑥月 8月 17 16:51:19 JST 2020 1⃣16:512⃣16:51:193⃣04:51:19 午後4⃣08/17/203 5⃣2020-08-176⃣月 8月 17 16:51:19 JST 2020frags(出力形式)- 左寄せ/右寄せflags指定とともにwidthを指定します。public class Test { public static void main(String[] args) { String s = String.format("左寄せ:文字[%1$-8S]数字[%2$-8d]/右寄せ:数字[%2$ 8d]", "FORMAT",12345); System.out.println(s); } }出力結果左寄せ:文字[FORMAT ]数字[12345 ]/右寄せ:数字[ 12345]- カンマ区切りflags「,」を指定するとロケール固有の区切り文字が追加されます、今回はロケール無指定(デフォルト)なので、千桁ごとに,(カンマ)が追加されます。public class Test { public static void main(String[] args) { String s = String.format("カンマ区切り:整数[%,d]浮動小数点[%,.3f]", 123456789,123456.789); System.out.println(s); } }出力結果カンマ区切り:整数[123,456,789]浮動小数点[123,456.789]- 0埋めflags指定とともにwidthを指定します。public class Test { public static void main(String[] args) { String s = String.format("0埋め[%09d]",12345); System.out.println(s); } }出力結果0埋め[000012345]width(最小文字数)とprecision(桁数)widthやprecisionを使って最大文字数や最小文字数を指定することができます。- 文字数指定浮動小数点は小数第6位までをデフォルトで表示します。小数第6位までを含めた最小文字数を指定します。public class Test { public static void main(String[] args) { String s = String.format("最小文字数指定:文字[%8S]整数[%8d]浮動小数点[%12f]", "FORMAT",12345,1234.5); System.out.println(s); String t = String.format("最大文字数指定:文字[%.3S]浮動小数点[%.3f]", "FORMAT",1.2345); System.out.println(t); } }出力結果最小文字数指定:文字[ FORMAT]整数[ 12345]浮動小数点[ 1234.500000] 最大文字数指定:文字[FOR]浮動小数点[1.235]エスケープシーケンス本記事では、文字列内に特殊な文字を埋め込む点で「書式指示子」と知識が混在してしまいがちである「エスケープシーケンス」も一緒に紹介します!両者をしっかりと区別して覚えましょう!そもそもエスケープシーケンス【escape sequence】とは通常は表記できない特殊な文字を文字列の中に混在させるために規定された特殊な記号や組み合わせのこと。先頭にバックスラッシュ(『/』の左右反対記号)、または『\』マークをつける。CSVデータファイルなどを使用して改行文字をデータベースに取込む場合や改行文字をメッセージの一部として表示する場合に、エスケープシーケンス(エスケープ文字)を使用します。javaで使用できる代表的なエスケープシーケンスを確認しましょう。以下が主なエスケープ文字の使い方です。public class Test { public static void main(String[] args) { String s = "TOKYOITCOLLEGE初心者から学べる" + "オンラインプログラミング学習" + "コーディネーターが案件探しのサポートや" + "疑問や相談に乗ります。"; System.out.println(s); String t = "\"TOKYO\tIT\tCOLLEGE\"\t初心者から学べる\n" + "オンラインプログラミング学習\r" + "コーディネーターが案件探しのサポートや\n" + "疑問や相談に乗ります。"; System.out.println(t); } }出力結果TOKYOITCOLLEGE初心者から学べるオンラインプログラミング学習コーディネーターが案件探しのサポートや疑問や相談に乗ります。 "TOKYO IT COLLEGE" 初心者から学べる オンラインプログラミング学習 コーディネーターが案件探しのサポートや 疑問や相談に乗ります。

【Java】ラッパークラスについての紹介!

【Java】ラッパークラスについての紹介!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!ラッパークラス(Wrapper class )Javaのデータ操作プログラムでやり取りする情報を値(データ)と呼びます。そのデータを一時的に記憶するために用意されているものが変数です。Javaでは変数の種類や範囲が決められており、この形式を型と呼びます。型は基本データ型(別名:値型/プリミティブ型)とクラス型(別名:参照型/リファレンス型)の二つに大きく分けることができます。※変数についての詳細は以下の記事で紹介しています。参考記事リンク:【Java】変数、定数の宣言と変数の列挙型、代入、型変換、型推論の使い方基本データ型とクラス型基本データ型はJavaに元から定義されています。数値や文字などの値を格納することができます。演算子と組み合わせる場合であれば基本データ型を使えば十分です。ですが、基本データ型のままでは加工処理機能(メソッドなど)を有してないという点があります。一方でクラス型は直接値を格納せずに参照先(値が格納されている場所の情報)を保持しています。インスタンス化することができ、メソッド等オブジェクトを呼び出して変数を操作することができます。この基本データ型のままでは足りないところや不便なところを補ったものが今回紹介するラッパークラスになります。データ型について詳しくは以下の記事で紹介しています。参考記事リンク:【Java】データ型(基本データ型とクラス型)についての紹介!ラッパークラス(Wrapper class )ラッパークラスとは、基本データ型をオブジェクトとして扱えるようにクラスとして定義したものです。int型などの基本データ型に対応するラッパークラスが用意されています。基本データ型の値をオブジェクト内に保持する事ができ、値を加工するための処理(メソッド)も用意されています。ラッパークラスの初期化ラッパークラスはNew演算子を使って以下のように初期化することができます。Boolean b_W = new Boolean(true);//論理型 Integer i_W = new Integer(100);//整数型 Double d_W = new Double(1.00);//浮動小数点型引数にはラッパークラスに対応する基本データ型を指定できるほかに、対応する基本データ型の値を表せるString文字列を指定することができます。Boolean b_W = new Boolean("true");//論理型 Integer i_W = new Integer("100");//整数型 Double d_W = new Double("1.00");//浮動小数点型コンストラクタによる初期化(インスタンス化)は非推奨となっています。ラッパークラスのインスタンス化においては下記で紹介するvalueOf メソッドが推奨されています。また下記で紹介するオートボクシング機能の実装によってJava5.0では値のみをそのまま記述した初期化ができるようになりました。Boolean b_W = true;//論理型 Integer i_W = 100;//整数型 Double d_W = 1.00;//浮動小数点型該当目次では詳しく紹介します。【見出しジャンプ:オートボクシング】基本データ型とラッパークラスの変換Java5.0以降ではラッパークラスの変換において下記で紹介するオートボクシング機能が実装されました。オートボクシングによって実装者は特に意識することなく、基本データ型⇒ラッパークラスへの変換を行うことができるようになっています。基本データ型からラッパークラスオブジェクトへ変換今回はラッパークラスの変換を明示的に記述するとどうなるかを最初にご紹介します。- オブジェクト生成時に代入ラッパークラスオブジェクトを生成したときに対応する基本データ型の値を引数に指定することで、基本データ型⇒ラッパークラスの変換をすることができます。boolean b =true; Boolean b_W = new Boolean(b);//論理型 int i =100; Integer i_W = new Integer(i);//整数型 double d =1.00; Double d_W = new Double(d);//浮動小数点型- valueOfメソッドラッパークラスにはvalueOfメソッドが実装してあり、このメソッドを使用して変換することも可能です。対応する基本データ型の値を引数に指定します。サンプルコードpublic class Test { public static void main(String args[]) { boolean b = true; Boolean b_Wv = Boolean.valueOf(b);//論理型 int i = 100; Integer i_Wv = Integer.valueOf(i);//整数型 double d = 1.00; Double d_Wv = Double.valueOf(d);//浮動小数点型 System.out.println(b_Wv); System.out.println(i_Wv); System.out.println(d_Wv); } }出力結果true 100 1.0◆引数にString文字列を指定またvalueOfメソッドは引数にString文字列を指定することができます。指定された文字列によって表される値を対応する基本データ型の値で返します。基本データ型に扱えない値が入った場合は実行時にエラーが生じます。サンプルコードpublic class Test { public static void main(String args[]) { Boolean b_Wv = Boolean.valueOf("true");//論理型 Integer i_Wv = Integer.valueOf("100");//整数型 Double d_Wv = Double.valueOf("1.00");//浮動小数点型 System.out.println(b_Wv); System.out.println(i_Wv);      System.out.println(d_Wv); } }出力結果true 100 1.0ラッパークラスオブジェクトから基本データ型へ変換ラッパークラスオブジェクトから基本データ型への変換の明示的な記述も紹介します。- ○○Valueメソッドラッパークラスオブジェクトから基本データ型への変換は○○Valueメソッドを使います。○○には基本データ型の名前が入ります。(ex. byteValue/floatValue)サンプルコードpublic class Test { public static void main(String args[]) { Boolean b_W = new Boolean(true);//論理型 boolean b =b_W.booleanValue(); Integer i_W = new Integer(100);//整数型 int i = i_W.intValue(); Double d_W = new Double(1.00);//浮動小数点型 double d =d_W.doubleValue(); System.out.println(b); System.out.println(i); System.out.println(d); } }出力結果true 100 1.0オートボクシングJava5.0からラッパークラスオブジェクトと基本データ型の変換が自動的に行われる機能が実装されました。その機能がオートボクシングです。この機能によって特に意識することなく基本データ型とラッパーオブジェクトを相互に変換することができるようになりました!- Java5.0以降に可能になった初期化基本データ型とラッパークラスオブジェクトが自動変換できるようになったおかげで、より簡単なコードでラッパークラスオブジェクトの生成ができるようになりました。Java5.0以前はvalueOfメソッドを使用したオブジェクト生成が主流でしたが、以下のように値をそのまま代入する記述で簡単にオブジェクト生成ができます。Boolean b_W = true;//論理型 Integer i_W = 100;//整数型 Double d_W = 1.00;//浮動小数点型※以降のサンプルコードはこの初期化を使っています。- ボクシング基本データ型からラッパークラスへの自動変換をボクシング(そのまま「オートボクシング」とも)と言います。変換メソッドを用いることなく、基本データ型の変数やリテラル(データそのもの)をラッパークラスの変数に直接代入する事ができるようになっています。サンプルコードpublic class Test { public static void main(String args[]) { boolean b = true; Boolean b_Wv = b;//論理型 int i = 100; Integer i_Wv = i;//整数型 double d = 1.00; Double d_Wv = d;//浮動小数点型 System.out.println(b_Wv); System.out.println(i_Wv); System.out.println(d_Wv); } }出力結果true 100 1.0- アンボクシングラッパークラスから基本データ型への自動変換をアンボクシングと言います。ボクシングと同様にラッパークラスのオブジェクトを、基本データ型の変数に直接代入する事ができるようになっています。サンプルコードpublic class Test { public static void main(String args[]) { Boolean b_W = true;//論理型 boolean b =b_W; Integer i_W = 100;//整数型 int i = i_W; Double d_W = 1.00;//浮動小数点型 double d =d_W; System.out.println(b); System.out.println(i); System.out.println(d); } }出力結果true 100 1.00◆アンボクシングの例外ラッパークラスオブジェクトにnullが代入されている際、アンボクシングを行うと基本データ型にはnullを代入することができないので例外が発生してしまいます。例外サンプルコードpublic class Test { public static void main(String args[]) { Boolean b_W = null;//論理型 boolean b =b_W; Integer i_W = null;//整数型 int i = i_W; Double d_W = null;//浮動小数点型 double d =d_W; System.out.println(b); System.out.println(i); System.out.println(d); } }出力結果Exception in thread "main" java.lang.NullPointerException【おまけ】文字列・データ型間の変換方法今回紹介したvalueOfメソッドは文字列・データ型間の変換にも使用されます。String型(文字列)とデータ型の変換はメソッドの引数やデータ比較、データベースへの登録などにおいて、お互いの整合性を合わせる場合などに必要となります。以下のようなメソッドがあります。 valueOfメソッド :文字列からデータ型、データ型から文字列の両方で使うことができます。 parse○○メソッド:文字列からデータ型へ変換する際に使います。○○にはデータ型の名前が入ります。 toStringメソッド  :データ型から文字列へ変換する際に使います。詳しくは以下の記事で紹介してるので是非参考にしましょう!参考記事リンク:【Java】 文字列・データ型間の変換方法ラッパークラスオブジェクトの比較ラッパークラスオブジェクトの比較は、Stingクラスの比較と同じように記述の仕方を注意しなければなりません。クラス型は値そのものではなく参照先(値が格納されている場所の情報)を保持しています。プログラム内部の処理で異なる場所に格納されることがあるので値は同じでも==演算子を使用した場合、結果が異なってしまうことがあります。ラッパークラスオブジェクトが生成(インスタンス化)されるたびに新しい参照先が生成されるため、同じ値を持った同じ型のオブジェクトでも参照先が異なっていれば==演算子では等しいと判断されません。そこで、ラッパークラスでの値の比較にはequalsメソッドを使いましょう!equalsメソッドでは、オブジェクトが保持している値を比較しますので、参照先(値が格納されている場所の情報)が異なっていても、保持している値が同一であればtrueを返します。サンプルコードpublic class Test { public static void main(String args[]) { Boolean b_W = true;//論理型 Boolean b_W1 = true; Integer i_W = 100;//整数型 Integer i_W1 = 128; Double d_W = 1.00;//浮動小数点型 Double d_W1 = 1.28; System.out.println(b_W.equals(b_W1)); System.out.println(i_W.equals(i_W1)); System.out.println(d_W.equals(d_W1)); } }出力結果true false false同じ参照型のデータであるStringオブジェクトの比較に関しては以下の記事で紹介しているので参考にどうぞ!参考記事リンク:【Java】Stringクラスの文字列比較・判定・検索

【Java】独自例外の作成方法

【Java】独自例外の作成方法

こんにちは、駆け出しエンジニアの伊藤です。東京ITカレッジのJava研修で学んだ内容を復習も兼ねて記事にしたいと思います。今回は、Javaの独自例外クラスについて解説していきます。Javaやプログラムについて勉強し始めた方の参考になれば幸いです!(eclipseを使用して計算を行っています)また、この記事に関して、例外の概要や try-catch、マルチキャッチ等について知っている方を対象としています。関連記事にて、例外の概要や try-catch について詳しく解説していますので、理解を深めたい方はご一読ください。関連記事:例外の概要、例外クラスについて ‐Exception、RuntimeException、Errorなど     例外制御‐try-catch、try-catch-finally、マルチキャッチ など)     例外制御  - throws、throw、printStackTrace()、getMessage()、getCause() など     try - with - resources 構文標準の例外クラスと独自例外クラスの作成Javaの標準APIには、多くの例外クラス(IOExceptionクラス、ArrayIndexOutOfBonudsExceptionクラスなど)が用意されています。そのお陰で例外クラスを使って、簡単に例外を発生させることが出来るのです。またJavaでは、標準APIに用意された例外クラス以外に、独自で例外クラスを作ることが出来ます。独自例外クラスを作る際には、既存の例外クラスを継承します。検査例外としたい場合には、Exceptionクラスもしくは、そのサブクラスを継承します。非検査例外とした場合には、RuntimeExceptionクラスもしくは、そのサブクラスを継承します。また、独自に作った例外クラスを継承することもできます。関連記事:例外の概要、例外クラスについて ‐検査例外・非検査例外独自例外クラスの作成方法(プログラムサンプル)簡単な独自例外を発生させるサンプルプログラムを見てみましょう。サンプルプログラムは、対応していないファイルが指定されたことを想定してあります。 1 // NotSupportedFileException ‐ オリジナル例外定義 2 package exception.gaiyou; 3 4 // 検査例外(Exception)を継承 5 public class NotSupportedFileException extends Exception{ 6 // 警告を回避するための宣言 7 private static final long serialVersionUID = 1L; 8 //エラーメッセージを受け取るコンストラクタ 9 public NotSupportedFileException(String msg) { 10 super(msg); 11 } 12 } 1 //NotSupportedFile サンプル 2 package exception.gaiyou; 3 4 public class NotSupportedFile { 5 public static void main(String[] args) { 6 System.out.println("-----実行結果-----"); 7 try { 8 // わざと独自例外を発生させる 9 throw new NotSupportedFileException("対応していないファイルです"); 10 } catch (Exception e) { 11 e.printStackTrace(); 12 } 13 } 14 }-----実行結果----- exception.gaiyou.NotSupportedFileException: 対応していないファイルです at exception.gaiyou.NotSupportedFile.main(NotFile.java:9)独自例外クラスである NotSupportedFileException は、Exceptionクラスを継承しているため、発生する例外は検査例外となります。継承元を RuntimeException(非検査例外)や IOException、NullPointerExceptionなどのクラスにすることもできます。作っているプログラム、システムに合わせ選ぶことが大切です。関連記事:例外の概要、例外クラスについて ‐検査例外・非検査例外     例外制御‐try-catch、try-catch-finally、マルチキャッチ など     コンストラクタについてまとめ独自例外について、分かったでしょうか?検査例外、非検査例外など例外処理の基本が分かっていれば難しいものではないです。ぜひ、他の例外についての記事にも目を通してみてください。関連記事:例外の概要、例外クラスについて ‐Exception、RuntimeException、Errorなど     例外制御‐try-catch、try-catch-finally、マルチキャッチ など)     例外制御  - throws、throw、printStackTrace()、getMessage()、getCause() など     try - with - resources 構文

【Java】"サロゲートペア"を包含する文字列の操作

【Java】"サロゲートペア"を包含する文字列の操作

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!サロゲートペアに関しての理解操作の紹介の前にサロゲートペアについて概要を学びましょう。Unicode世界中の文字に通し番号を割り当て同じコード体系のもとに文字の処理をコンピュータ上で使用可能にするために考案されたものが、『Unicode』という国際的な業界規格です。Unix、Windows、macOS、Javaなど多くのシステムで利用され、世界で使われる全ての文字を共通の文字集合で利用することを可能にしてくれています。標準規格があるからこそ、私たちは様々なコンピュータシステムで多くの文字を同じように処理することができるようになっています。Unicodeにはコンピュータで文字を処理するために様々なことが規定されています。以下で紹介する「コードポイント」、「UTF-16」、「サロゲートペア」もUnicodeで規定されているものです。確認していきましょう!コードポイント文字を互いに区別するために、数値(0x0000から0x10FFFFまでの数値)が割り振られています。この数値をコードポイントと言います。例えば、'あ'のコードポイントは’0x3042’という数値が割り振られています。コートポイントによって世界中の文字を同じコード体系のもとで扱うことができるようになります。UTF-16”コードポイント”を”Javaの内部処理(CPU)で使用できる2進数で表現する符号化方式です。一文字を2バイト(16ビット)のコードで表しています。Javaプログラムのchar値や文字列(String)の内部処理ではUTF-16を使っており、これによってJavaプログラムが文字を理解し処理することができます。一つの文字を 16 ビット(2 バイト)のコードで表すと65,536 個(2の16乗個)の文字を表現できるので、当初は世界中の文字を網羅できると考えられていました。しかし世界中の文字は想像以上に多かったため、16 ビットのコードを 2 つ使って新しい 1 つの文字を定義するという手法が導入されることになります。それが今回紹介するサロゲートペアです。サロゲートペアUTF-16方式で16ビットには収まりきらなかった文字を表現するための拡張機能を総称して”サロゲートペア”と呼ばれています。通常2バイト一文字で表すところを、4バイト一文字で表現することで扱える文字数を増やすように考案されました。サロゲートペアの導入により多くの文字を表せるようになった反面、一文字を、2バイトで表せる文字と4バイトで表せる文字に分かれることになります。↓この拡張によってサロゲートペアを包含する文字列の文字数表示の操作に注意が必要になりました。サロゲートペアを包含する文字列の文字数String クラスlengthメソッドは2 バイトで 1 文字として計算するので文字列の中にサロゲートペアを含む場合、正しい結果を返せません。そのような場合はcodePointCountメソッドを使う必要があります。codePointCountメソッドint codePointCount(int beginIndex, int endIndex)第一引数に開始位置インデックス()、第二引数に終了インデックス()を取ります。Unicodeのコードポイントの数を結果として返します。よってサロゲートペアでも対応することができるのです。lengthメソッドと比較して、codePointCountメソッドの実装例を見てみましょう。※Works ブログの都合上、文字化けで 『????』が 表示されていますが、『叱』の環境依存文字です。public class Test { public static void main(String[] args) { String s ="????"; System.out.println("lengthtメソッド:"+s.length()); System.out.println("codePointCountメソッド:"+s.codePointCount(0,s.length())); } }出力結果lengthtメソッド:2 codePointCountメソッド:1結果で出力された二つのint値が異なることが確認できると思います。このようにサロゲートペアが包含された文字列ではlengthメソッドが正しく動作しません。なぜならlengthメソッドは2バイトを1文字と判断するからです。サロゲートペアを含む文字列の文字数を取得する場合は、Unicodeコード・ポイントの数を結果として返すcodePointCountメソッドが正しい文字数を出力してくれます。サロゲートペアが含まれていない通常の文字列の場合、どちらのメソッドでも同じ結果を出しますが、lengthメソッドの方が速い処理を行います!public class Test { public static void main(String[] args) { String s ="Hello World!"; System.out.println("lengthtメソッド:"+s.length()); System.out.println("codePointCountメソッド:"+s.codePointCount(0,s.length())); } }出力結果lengthtメソッド:12 codePointCountメソッド:12