質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

1回答

11838閲覧

"java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0"がどうしても解決できません

retantaro

総合スコア15

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

1クリップ

投稿2021/10/18 06:27

編集2021/10/19 00:00

前提・実現したいこと

Eclipseでjavaを使ってwebブラウザで入力された都道府県名と同じ県名の面積、人口をデータベースから読み込み、県名、面積、人口を出力するプログラムを作成しています。
そこで、どうしても下記のエラーが出てしまい、Java初心者なものでなかなか前進しないので質問を投稿させていただきました。
SQL文を簡単で確実に実行結果出るものに変えてみたりしましたが、同じくデータが一つも存在しないことになってしまいます。

どうかご指摘、解説いただけると大変ありがたいです。

発生している問題・エラーメッセージ

タイプ 例外報告 メッセージ java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0 説明 サーバーは予期しない条件に遭遇しました。それはリクエストの実行を妨げます。 例外 org.apache.jasper.JasperException: java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0 org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:582) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:498) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:383) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:331) javax.servlet.http.HttpServlet.service(HttpServlet.java:764) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) servlet.PrefectureSrv.doPost(PrefectureSrv.java:49) javax.servlet.http.HttpServlet.service(HttpServlet.java:681) javax.servlet.http.HttpServlet.service(HttpServlet.java:764) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 根本原因 java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0 java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64) java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70) java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248) java.base/java.util.Objects.checkIndex(Objects.java:372) java.base/java.util.ArrayList.get(ArrayList.java:458) org.apache.jsp.WEB_002dINF.jsp.PrefectureResult_jsp._jspService(PrefectureResult_jsp.java:136) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) javax.servlet.http.HttpServlet.service(HttpServlet.java:764) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:465) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:383) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:331) javax.servlet.http.HttpServlet.service(HttpServlet.java:764) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) servlet.PrefectureSrv.doPost(PrefectureSrv.java:49) javax.servlet.http.HttpServlet.service(HttpServlet.java:681) javax.servlet.http.HttpServlet.service(HttpServlet.java:764) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 注意 原因のすべてのスタックトレースは、サーバのログに記録されています

該当のソースコード

java

1//PrefectureSrv.java 2package servlet; 3 4import java.io.IOException; 5import java.util.List; 6 7import javax.servlet.RequestDispatcher; 8import javax.servlet.ServletException; 9import javax.servlet.annotation.WebServlet; 10import javax.servlet.http.HttpServlet; 11import javax.servlet.http.HttpServletRequest; 12import javax.servlet.http.HttpServletResponse; 13 14import dao.PrefectureDAO; 15import model.PrefectureData; 16 17/** 18 * Servlet implementation class DataBaseServer 19 */ 20 21@WebServlet("/PrefectureSrv") 22public class PrefectureSrv extends HttpServlet { 23 private static final long serialVersionUID = 1L; 24 25 /** 26 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse 27 * response) 28 */ 29 protected void doGet(HttpServletRequest request, HttpServletResponse response) 30 throws ServletException, IOException { 31 // フォワード 32 RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/PrefectureInput.jsp"); 33 dispatcher.forward(request, response); 34 } 35 36 /** 37 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse 38 * response) 39 */ 40 protected void doPost(HttpServletRequest request, HttpServletResponse response) 41 throws ServletException, IOException { 42 43 String name = request.getParameter("name"); 44 // データベースから一覧を取得する 45 PrefectureDAO preDAO = new PrefectureDAO(); 46 List<PrefectureData> preList = preDAO.Search(name); 47 48 request.setAttribute("preList", preList); 49 RequestDispatcher dispatcher1 = request.getRequestDispatcher("/WEB-INF/jsp/PrefectureResult.jsp"); 50 dispatcher1.forward(request, response); 51 } 52 53} 54 55 56//PrefectureData.java 57package model; 58 59public class PrefectureData implements java.io.Serializable{ 60 private String name; 61 private double area; 62 private double population; 63 64 public PrefectureData(String name, double area, double population) { 65 this.name = name; 66 this.area = area; 67 this.population = population; 68 } 69 70 public final String getName() { 71 return name; 72 } 73 74 public void setName(String name) { 75 this.name = name; 76 } 77 78 public final double getArea() { 79 return area; 80 } 81 82 public void setArea(double area) { 83 this.area = area; 84 } 85 86 public final double getPopulation() { 87 return population; 88 } 89 90 public void setPopulation(double population) { 91 this.population = population; 92 } 93} 94 95 96//PrefectureDAO.java 97package dao; 98 99import java.sql.Connection; 100import java.sql.DriverManager; 101import java.sql.PreparedStatement; 102import java.sql.ResultSet; 103import java.sql.SQLException; 104import java.util.ArrayList; 105import java.util.List; 106 107import model.PrefectureData; 108 109public class PrefectureDAO { 110 // データベース接続に使用する情報 111 private final String JDBC_URL = "jdbc:oracle:thin:@//172.16.4.6:1521/infopdb"; 112 private final String DB_USER = "uenoa"; 113 private final String DB_PASS = "uenoa"; 114 115 public List<PrefectureData> Search(String findName) { 116 List<PrefectureData> preList = new ArrayList<>(); 117 118 String sql = "select 県名, 面積, 人口 from REVENGE where 県名 = ?"; 119 120 try( 121 Connection con = DriverManager.getConnection(JDBC_URL, DB_USER, DB_PASS); 122 ) { 123 PreparedStatement pstmt = con.prepareStatement(sql); 124 pstmt.setString(1, findName); 125 ResultSet rs = pstmt.executeQuery(); 126 // データの出力 127 while (rs.next()) { 128 String name = rs.getString("県名"); 129 double area = rs.getDouble("面積"); 130 double population = rs.getDouble("人口"); 131 PrefectureData preData = new PrefectureData(name, area, population); 132 preList.add(preData); 133 } 134 135 } 136 catch(SQLException e) { 137 e.printStackTrace(); 138 } 139 140 return preList; 141 } 142} 143 144 145//PrefectureInput.jsp 146<%@ page language="java" contentType="text/html; charset=UTF-8" 147 pageEncoding="UTF-8"%> 148<%@ page import="javax.servlet.http.*,javax.servlet.*"%> 149 150<!DOCTYPE html> 151<html> 152<head> 153<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 154<title>県名入力</title> 155</head> 156<body> 157 <form method="post" action="./PrefectureSrv"> 158 <div>検索したい県名を入力してください</div> 159 <div> 160 <input type="text" name="name" maxlength="20" size="20"> 161 </div> 162 <input type="submit" value="検索"> 163 </form> 164</body> 165 166</html> 167 168 169//PrefectureResult.jsp 170<%@ page language="java" contentType="text/html; charset=UTF-8" 171 pageEncoding="UTF-8"%> 172<%@ page import="javax.servlet.http.*,javax.servlet.*" 173 import="java.io.*,java.util.*,java.text.*" 174%> 175<%@ page import="model.PrefectureData"%> 176<% 177 request.setCharacterEncoding("UTF-8"); 178 List<PrefectureData> preList = (List<PrefectureData>) request.getAttribute("preList"); 179%> 180 181<!DOCTYPE html> 182<html> 183<head> 184<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 185<title>検索結果</title> 186</head> 187<body> 188 <p><%= preList.get(0).getName() %></p> 189 <p><%= preList.get(0).getArea() %></p> 190 <p><%= preList.get(0).getPopulation() %></p> 191</body> 192 193</html>

試したこと

データベースに接続されているか(ドライバーが設定されているか、id・パスワードが正しいか、SQL文が正しいか)
List型、Object型のキャストの仕方が正しいか
"java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0"についてよく調べましたが、なかなか期待通りに動作しませんでした。

補足情報(FW/ツールのバージョンなど)

tomcat v8.5
jdk 11.0.6

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

IndexOutOfBoundsExceptionが発生しそうな場所は、ここくらい。

jsp

1<body> 2 <p><%= preList.get(0).getName() %></p> 3 <p><%= preList.get(0).getArea() %></p> 4 <p><%= preList.get(0).getPopulation() %></p> 5</body>

preListが空っぽ、なのではないかと。

そして、空っぽのpreListを作っていそうなのは、ここ。

java

1 public List<PrefectureData> Search(String findName) { 2 List<PrefectureData> preList = new ArrayList<>(); 3 String sql = "select 県名, 面積, 人口 from REVENGE where 県名 = ?"; 4... 5 PreparedStatement pstmt = con.prepareStatement(sql); 6 pstmt.setString(1, findName); 7 ResultSet rs = pstmt.executeQuery();

findNameの内容は、想定通りなのでしょうか。nullが入っているとか、東京でいいのに東京都になっているとか。
このあたりを確認してみてはいかがかと。

投稿2021/10/18 08:20

編集2021/10/18 08:34
shiketa

総合スコア3971

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

retantaro

2021/10/19 00:18

回答ありがとうございます。 ブレークポイントを使ってデバッグしてみた結果、 findNameの中身には"東京都"という"東京都"の文字化けしたものが表示されました。 他の県名でも試しましたが、同じように文字化けしたものが表示されます。 EclipseのUIの文字表示の問題なのか、文字化けした文字自体が変数に入っているのか、 どちらなのでしょうか。 入力文字については、データベースの"REVENGE"テーブルに存在している県名と同じです。 コマンドプロンプトでは"select 県名, 面積, 人口 from REVENGE where 県名 = '東京都';"という SQL文を実行すると正しい結果が返ってきます。 なのでSQL文、データベースのデータは問題ないのかなと思っています。 やはり、Javaのコーディングの問題なのでしょうか。
retantaro

2021/10/19 02:41

なるほど、そのままの設定で日本語がうまく扱えないわけですね。 "PrefectureSrv.java"のdoPostメソッドに"request.setCharacterEncoding("UTF-8");"というコードを記述して、UTF-8に指定することで解決できました。 長らく困っていたのでとても助かりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問