2013年9月22日日曜日

[Java][FindBugs]”VA_PRIMITIVE_ARRAY_PASSED_TO_OBJECT_VARARG”とは

FindBugs 2.0.2 / Java 6で検知できるパターンID:(VA_PRIMITIVE_ARRAY_PASSED_TO_OBJECT_VARARG)の意味が良くわかっていなかったのでメモしておきます。

このパターンについて、FindBugsのバグエクスプローラによる説明を改めて見てみます。
このコードは可変引数をとるメソッドにプリミティブ型の配列を渡しています。これは結局、要素型が配列である、サイズ1の配列が生成されて、その要素にこのプリミティブ型の配列が格納されてメソッドに渡されることになります。 
どういうことなの…?
そこで以下のコードを考えてみます。

 /**
  * 可変長引数に渡す変数がオブジェクトとプリミティブ型で挙動が異なる。
  */
 private void execute() {

  // オブジェクトの配列を渡す
  List<Integer> integerList = Arrays.asList(new Integer[] { 1, 2 });

  // プリミティブ型の配列を渡す
  List<int[]> intList = Arrays.asList(new int[] { 3, 4 });

 }
Arrays.asListは可変長引数を持つメソッドです。ローカル変数であるintegerListとintListの型を見てみると、integerListはIntegerのリストなのに、intListはint配列のリストになっています
直感的には、intListもintのリストになってくれてもいい気がします。
 
ここで、改めてバグエクスプローラの説明を見ます。
なるほど、確かにその通りでした。

結論としては、可変引数のメソッドはオブジェクトとプリミティブ型で挙動が違うから気をつけろ、ということが言いたいんですね。
まあ、上記コードのように戻り値があれば、違いは明らかなので問題は起きないと思います。

ちなみに、上記コードではFindBugsによって検知されません。

2013年9月12日木曜日

2013年7月26日金曜日

JSPからJNLPを生成する。jsp generate jnlp

jnlpにパラメータを渡して実行できる利点があります。 ファイル名はrun.jsp(仮)
<%
//  JSPを記述
response.setHeader("Content-Disposition", "attachment;filename=run.jnlp");
%>

<?xml version="1.0" encoding="Shift_JIS"?>
<jnlp spec="0.2 1.0" codebase="http://xxx.x.x.x/">
     <!-- JNLPを記述 -->
</jnlp>

keytool error: java.lang.IllegalStateException: masked envelope

/jdk/bin/keytool 実行時に発生した例外
keytool error: java.lang.IllegalStateException: masked envelope
単純に出力先に.keystoreが存在していただけ。削除し、再度実行したら発生しなくなくなりました。 実行環境がJava4なので、もはや見ることは無いと思いますがメモ。

2013年4月30日火曜日

Oracle 11 テーブル一覧を確認するSQL

set linesize 300
column table_name format a40
column tablespace_name format a20
select table_name, tablespace_name, status from user_tables;

2013年3月9日土曜日

Eclipse 3.7.2 Indigo SR2 Pleiades All in OneでSVNコネクターのバージョンをSVNKit 1.3.8に上げる (Subversive)

 Eclipse 3.7.2 Indigo SR2 Pleiades All in Oneを新規にインストールした状態を前提としています。
  1. ヘルプ>新規ソフトウェアのインストール>作業対象にhttp://download.eclipse.org/technology/subversive/1.0/update-site-1.0.1/で全てインストール
  2. ヘルプ>新規ソフトウェアのインストール>作業対象にhttp://community.polarion.com/projects/subversive/download/eclipse/3.0/update-site/で全てインストール
  3. ウィンドウ>設定>チーム>SVN>SVNクライアント>SVNクライアントにSVNKit 1.3.8…を設定

職場の都合でSVNコネクターのバージョンを上げなくてはならなかったのですが、かなりハマりました。
eclipseの「更新の確認」などでも出来ず。また、他のサイトで「SVN関連プラグインをアンインストールをしてから~」とあるものの、eclipse上からではアンインストール出来なかったので。 なんでなんですかね。
とりあえず、上記手順で上手くいきました。