最近のレビュー指摘の備忘録１（Java系)

## 0.背景
最近レビュー指摘で言われたよく忘れることをメモします。
３つほどあります。

## 1.Javaにおいてのloggerによるログ出力

以下のように、メッセージと一覧として記載することが多かったのですが、
```java:test1.java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

void Test1()
{
    protected final static Logger logger = LoggerFactory.getLogger(LogUtils.class);

    String str= null;
    int length = 0;
    try
    {
        length = str.length();
        logger.info("OK");
    }
    // 指摘該当箇所
    catch (NullPointerException e)
    {
        e.printStackTrace();
        logger.error("NullPointerException=" + e.toString());
    }
    finally
    {
        length = 0;
    }
}
```

これだとExcepitonの中身を重複して出してしまうので以下の1行にまとめること。
↓
↓
↓
```java:test1.java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

void Test1()
{
    protected final static Logger logger = LoggerFactory.getLogger(LogUtils.class);

    String str= null;
    int length = 0;
    try
    {
        length = str.length();
        logger.info("OK");
    }
    // 改善箇所
    catch (NullPointerException e)
    {
        logger.error("[Test1] NullPointerException:", e);
    }
    finally
    {
        length = 0;
    }
}
```

## 2.Javaにおいての破棄タイミング（try-with-resources文）

DBからの取得において、
Connection,
PreparedStatement,
ResultSet
のコンボをよく使うのですが、毎回Finallyなどで
逐一破棄しておりました。
※コネクション系のインポートや詳細な接続に関する記述は割愛

以下のように
```java:test2.java
void Test2()
{
    Connection con = null;
    PreparedStatement preste = null;
    ResultSet result = null;

    try
    {
        con = DBConnection.getConnection();
        preste = con.prepareStatement("SELECT * FROM M_USER");
        result = preste.executeQuery();
        if(result.next())
        {
            System.out.print("result:" + result.getInt("ID"));
        }
    }
    catch (Exception e)
    {
        logger.error("[Test2] Exception:", e);
    }
    finally
    {
        DBConnection.releaseResources(con);
        DBConnection.releaseResources(preste);
        DBConnection.releaseResources(result);
    }
}
```



これをtry-catch構文終わりに自動的に破棄させようぜという
ことです。
↓
↓
↓
```java:test2.java
void Test2()
{
    try (Connection con = DBConnection.getConnection();
         PreparedStatement preste = con.prepareStatement("SELECT * FROM M_USER"))
    {
        try (ResultSet result = preste.executeQuery())
        {
            if (result.next())
              System.out.print("result:" + result.getInt("ID"));
        }
    }
    catch (Exception e)
    {
        logger.error("[Test2] Exception:", e);
    }
}
```

## 3.Javaにおいての文字列のエスケープの意識
クロスサイトスプリクティングを意識して、文字列入力フォームに意図せぬスクリプトタグを入力された場合に不正な動きをしないように意識する。
（これは日々言われておりよく忘れるための備忘録）

```java:test3.java
import org.apache.commons.text.StringEscapeUtils;
void Test3()
{
    // HTMLエスケープ
    String targetStr = StringEscapeUtils.escapeHtml4("<script>alert('ERROR');</script>");
    System.out.println("エスケープ後: " + targetStr);
}
```
基本的には文字列を出力する箇所については「StringEscapeUtils.escapeHtml4」をすることで、防ぐことが可能。


また、少し余談であるがJSPなどで文字列を出力する際は以下のようなそのまま出すのではなく
```jsp:test3.jsp
import org.apache.commons.text.StringEscapeUtils;

"<lable>名前は、" + <%= Name %> + "です！</lable>";
```
以下のように文字列をエスケープするべきである。

```jsp:test3.jsp
import org.apache.commons.text.StringEscapeUtils;

"<lable>名前は、" + <%= StringEscapeUtils.escapeHtml4(Name) %> + "です！</lable>";
```

## 4.まとめ
小技ばかりですが、このような積み重ねがレビュー指摘を減らす一歩
になるのでまた随時更新します。