JSPの最近のブログ記事

2011年4月14日

Tomcatエラーメッセージ(変数編)

Duplicate local variable 変数名

「Duplicate local variable 変数名」は同じ名前の変数を重複して宣言しているために起きるエラーです。

サンプル

<%@ page contentType="text/html; charset=Windows-31J"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
	 "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>JSPサンプル</title>
<meta http-equiv="content-type" content="text/html; charset=Windows-31J">
</head>
<body>
<p>
<%
int i = 10;
int i = 20;	//エラー発生
%>
<%=i%>
</p>
</body>
</html>

上記のjspファイルを実行すると下記のエラーが表示されます。

org.apache.jasper.JasperException: JSPのクラスをコンパイルできません

JSPファイル: /Test1.jsp の中の11行目でエラーが発生しました
生成されたサーブレットのエラーです:
Duplicate local variable i

12行目で変数iを宣言したのに、13行目でも同じ名前iで宣言しているため起きたエラーです。
javaでは同じ名前の変数を複数宣言することはできません。

「11行目でエラーが発生しました」とあるが実際にエラーが起きているのは13行目です。
JSPの場合、エラーが含まれる<% %>開始タグの行番号が表示されるので注意が必要です。

対処法1

<%@ page contentType="text/html; charset=Windows-31J"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
	 "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>JSPサンプル</title>
<meta http-equiv="content-type" content="text/html; charset=Windows-31J">
</head>
<body>
<p>
<%
int i = 10;
i = 20; //12行目で宣言されたiを使う
%>
<%=i%>
</p>
</body>
</html>

対処法1の表示結果

20

対処法2

<%@ page contentType="text/html; charset=Windows-31J"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
	 "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>JSPサンプル</title>
<meta http-equiv="content-type" content="text/html; charset=Windows-31J">
</head>
<body>
<p>
<%
int i = 10;
int j = 20; //iは12行目で宣言されてるので別名jで変数を宣言した
%>
<%=i%>
</p>
</body>
</html>

対処法2の表示結果

10

変数名 cannot be resolved

「変数名 cannot be resolved」は宣言されていない変数を使用したために起きるエラーです。

サンプル

<%@ page contentType="text/html; charset=Windows-31J"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
	 "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>JSPサンプル</title>
<meta http-equiv="content-type" content="text/html; charset=Windows-31J">
</head>
<body>
<p>
<%
int i = 10;
%>
<%=j%>
</p>
</body>
</html>

上記のjspファイルを実行すると下記のエラーが表示されます。

org.apache.jasper.JasperException: JSPのクラスをコンパイルできません

JSPファイル: /Test2.jsp の中の14行目でエラーが発生しました
生成されたサーブレットのエラーです:
j cannot be resolved

14行目で宣言されていない変数jを表示しようとしたため起きたエラーです。

対処法

<%@ page contentType="text/html; charset=Windows-31J"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
	 "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>JSPサンプル</title>
<meta http-equiv="content-type" content="text/html; charset=Windows-31J">
</head>
<body>
<p>
<%
int i = 10;
int j = 20; //変数jを使う前に宣言・初期化する
%>
<%=j%>
</p>
</body>
</html>

表示結果

20

The local variable 変数名 may not have been initialized

「The local variable 変数名 may not have been initialized」は初期化されていない変数を使用したために起きるエラーです。

サンプル

<%@ page contentType="text/html; charset=Windows-31J"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
	 "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>JSPサンプル</title>
<meta http-equiv="content-type" content="text/html; charset=Windows-31J">
</head>
<body>
<p>
<%
int j;
%>
<%=j%>
</p>
</body>
</html>

上記のjspファイルを実行すると下記のエラーが表示されます。

org.apache.jasper.JasperException: JSPのクラスをコンパイルできません

JSPファイル: /Test1.jsp の中の14行目でエラーが発生しました
生成されたサーブレットのエラーです:
The local variable j may not have been initialized

14行目で初期化されていない変数jを表示しようとしたため起きたエラーです。

対処法

<%@ page contentType="text/html; charset=Windows-31J"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
	 "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>JSPサンプル</title>
<meta http-equiv="content-type" content="text/html; charset=Windows-31J">
</head>
<body>
<p>
<%
int j = 20; //変数jに値をいれて初期化する
%>
<%=j%>
</p>
</body>
</html>

表示結果

20

2011年2月19日

TOMCATの再起動をbatファイルで行う

サービスの再起動を「コントロールパネル>管理ツール>サービス」から行うのは面倒なので、batファイルから再起動させてみる。

  1. 基本ファイル
  2. TOMCAT再起動用

基本ファイル

下記ファイルの9行目に再起動の対象サービス名、12行目にログの出力場所を記述し「任意の名前.bat」として保存します。(windowsで実行させるので作成ファイルの文字コードはShift-JISにします)

あとは再起動を行いたい時に作成したbatファイルをダブルクリックすれば処理が実行されます。

ちなみに今回はサービスが開始していない時も、再起動できるようにエラー時に処理を中止していません。処理を中止させたい時は、エラーログ出力後に「exit」してください。

@echo off

rem -------------------------------------------------
rem サービスの再起動用batファイル
rem -------------------------------------------------


rem # 再起動サービス名
set SERVICE="サービス名を記述"

rem # ログ出力パス
set LOG=出力パスを記述
rem # 実行日時出力
echo ---------- >> %LOG%
date /t >> %LOG%
time /t >> %LOG%

rem # 対象サービス停止コマンド実施
net stop %SERVICE% >> %LOG%


rem # 対象サービス停止エラー判定
if %errorlevel%==0 goto STOP_OK
rem # エラー時
  echo サービス終了時にエラーが発生しました。 >> %LOG%
  echo エラー番号:%errorlevel% >> %LOG%
  net helpmsg %errorlevel% >> %LOG%

rem # 正常時
:STOP_OK
echo 処理終了時刻 >> %LOG%
time /t >> %LOG%
echo. >> %LOG%

rem # 対象サービス開始コマンド実施
net start %SERVICE% >> %LOG%

if %errorlevel%==0 goto START_OK
rem # エラー時
  echo サービス開始時にエラーが発生しました。 >> %LOG%
  echo エラー番号:%errorlevel% >> %LOG%
  net helpmsg %errorlevel% >> %LOG%

rem # 正常時
:START_OK
echo 処理終了時刻 >> %LOG%
time /t >> %LOG%
echo. >> %LOG%

TOMCAT再起動用

例えば「Apache Tomcat」を再起動させ、ログファイルを「C:\restart_service.log」に出力するbatファイルは以下のような記述になります。

@echo off

rem -------------------------------------------------
rem サービスの再起動用batファイル
rem -------------------------------------------------


rem # 再起動サービス名
set SERVICE="Apache Tomcat"

rem # ログ出力パス
set LOG=C:\restart_service.log

rem # 実行日時出力
echo ---------- >> %LOG%
date /t >> %LOG%
time /t >> %LOG%

rem # 対象サービス停止コマンド実施
net stop %SERVICE% >> %LOG%


rem # 対象サービス停止エラー判定
if %errorlevel%==0 goto STOP_OK
rem # エラー時
  echo サービス終了時にエラーが発生しました。 >> %LOG%
  echo エラー番号:%errorlevel% >> %LOG%
  net helpmsg %errorlevel% >> %LOG%

rem # 正常時
:STOP_OK
echo 処理終了時刻 >> %LOG%
time /t >> %LOG%
echo. >> %LOG%

rem # 対象サービス開始コマンド実施
net start %SERVICE% >> %LOG%

if %errorlevel%==0 goto START_OK
rem # エラー時
  echo サービス開始時にエラーが発生しました。 >> %LOG%
  echo エラー番号:%errorlevel% >> %LOG%
  net helpmsg %errorlevel% >> %LOG%

rem # 正常時
:START_OK
echo 処理終了時刻 >> %LOG%
time /t >> %LOG%
echo. >> %LOG%