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

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

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

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

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

解決済

2回答

827閲覧

java500エラーについて

hidaruma86

総合スコア8

Java

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

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

0グッド

0クリップ

投稿2020/11/17 00:30

編集2020/11/17 02:57

前提・実現したいこと

Index: 15, Size: 15typeのエラーが表示されたのかを知りたい。
List<Report>型からListの中に入っている情報を取得する方法を知りたい

sql

1List<Report>にはreportsテーブルが入っているのですがこれのemployee_idを取得したいです 2+-------------------+--------------+------+-----+---------+----------------+ 3| Field | Type | Null | Key | Default | Extra | 4+-------------------+--------------+------+-----+---------+----------------+ 5| id | int(11) | NO | PRI | NULL | auto_increment | 6| content | longtext | NO | | NULL | | 7| created_at | datetime | NO | | NULL | | 8| reaction_nice_cnt | int(11) | NO | | NULL | | 9| report_date | date | NO | | NULL | | 10| title | varchar(255) | NO | | NULL | | 11| updated_at | datetime | NO | | NULL | | 12| employee_id | int(11) | NO | MUL | NULL | | 13+-------------------+--------------+------+-----+---------+----------------+

Report.java

java

1package models; 2 3import java.sql.Date; 4import java.sql.Timestamp; 5 6import javax.persistence.Column; 7import javax.persistence.Entity; 8import javax.persistence.GeneratedValue; 9import javax.persistence.GenerationType; 10import javax.persistence.Id; 11import javax.persistence.JoinColumn; 12import javax.persistence.Lob; 13import javax.persistence.ManyToOne; 14import javax.persistence.NamedQueries; 15import javax.persistence.NamedQuery; 16import javax.persistence.Table; 17 18@Table(name = "reports") 19@NamedQueries({ 20 @NamedQuery( 21 name = "getAllReports", 22 // 全ての日報情報を取得 23 query = "SELECT r FROM Report AS r ORDER BY r.id DESC" 24 ), 25 @NamedQuery( 26 name = "getReportsCount", 27 // 日報の前件数を取得 28 query = "SELECT COUNT(r) FROM Report AS r" 29 ), 30 @NamedQuery( 31 name = "getMyAllReports", 32 // 自分の日報を先に登録した順番に並べ替える 33 query = "SELECT r FROM Report AS r WHERE r.employee = :employee ORDER BY r.id DESC" 34 ), 35 @NamedQuery( 36 name = "getMyReportsCount", 37 // 指定された日報がすでにデータベースに存在しているかを調べる 38 query = "SELECT COUNT(r) FROM Report AS r WHERE r.employee = :employee" 39 ), 40}) 41@Entity 42public class Report { 43 @Id 44 @Column(name = "id") 45 @GeneratedValue(strategy = GenerationType.IDENTITY) 46 private Integer id; 47 48 // @ManyToOneで多対一関連を定義 49 @ManyToOne 50 // @JoinColumnで統合に用いるカラムを指定 51 @JoinColumn(name = "employee_id", nullable = false) 52 private Employee employee; 53 54 // date型は年月日のみ 55 @Column(name = "report_date", nullable = false) 56 private Date report_date; 57 58 @Column(name = "title", length = 255, nullable = false) 59 private String title; 60 61 // @Lobとすることで改行もデータベースに保存される 62 @Lob 63 @Column(name = "content", nullable = false) 64 private String content; 65 66 @Column(name = "created_at", nullable = false) 67 private Timestamp created_at; 68 69 @Column(name = "updated_at", nullable = false) 70 private Timestamp updated_at; 71 72 @Column(name = "reaction_nice_cnt", nullable = false) 73 private Integer reaction_nice_cnt; 74 75 public Integer getId() { 76 return id; 77 } 78 79 public void setId(Integer id) { 80 this.id = id; 81 } 82 83 public Employee getEmployee() { 84 return employee; 85 } 86 87 public void setEmployee(Employee employee) { 88 this.employee = employee; 89 } 90 91 public Date getReport_date() { 92 return report_date; 93 } 94 95 public void setReport_date(Date report_date) { 96 this.report_date = report_date; 97 } 98 99 public String getTitle() { 100 return title; 101 } 102 103 public void setTitle(String title) { 104 this.title = title; 105 } 106 107 public String getContent() { 108 return content; 109 } 110 111 public void setContent(String content) { 112 this.content = content; 113 } 114 115 public Timestamp getCreated_at() { 116 return created_at; 117 } 118 119 public void setCreated_at(Timestamp created_at) { 120 this.created_at = created_at; 121 } 122 123 public Timestamp getUpdated_at() { 124 return updated_at; 125 } 126 127 public void setUpdated_at(Timestamp updated_at) { 128 this.updated_at = updated_at; 129 } 130 131 public Integer getReaction_nice_cnt() { 132 return reaction_nice_cnt; 133 } 134 135 public void setReaction_nice_cnt(Integer reactio_nice_cnt) { 136 this.reaction_nice_cnt = reactio_nice_cnt; 137 } 138 139}

error

1HTTPステータス 500 - Index: 15, Size: 15 2type 例外レポート 3 4メッセージ Index: 15, Size: 15 5 6説明 The server encountered an internal error that prevented it from fulfilling this request. 7 8例外 9 10java.lang.IndexOutOfBoundsException: Index: 15, Size: 15 11 java.util.ArrayList.rangeCheck(ArrayList.java:653) 12 java.util.ArrayList.get(ArrayList.java:429) 13 controllers.reports.ReportsIndexServlet.doGet(ReportsIndexServlet.java:79) 14 javax.servlet.http.HttpServlet.service(HttpServlet.java:622) 15 javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 16 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 17 filters.LoginFilter.doFilter(LoginFilter.java:74) 18 filters.EncodingFilter.doFilter(EncodingFilter.java:55) 19注意 原因のすべてのスタックトレースは、Apache Tomcat/8.0.43のログに記録されています``` 20エラーメッセージ

ReportIndexServlet

java

1package controllers.reports; 2 3import java.io.IOException; 4import java.util.List; 5 6import javax.persistence.EntityManager; 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 models.Employee; 15import models.Report; 16import utils.DBUtil; 17 18/** 19 * Servlet implementation class ReportsIndexServlet 20 */ 21@WebServlet("/reports/index") 22public class ReportsIndexServlet extends HttpServlet { 23 private static final long serialVersionUID = 1L; 24 25 /** 26 * @see HttpServlet#HttpServlet() 27 */ 28 public ReportsIndexServlet() { 29 super(); 30 // TODO Auto-generated constructor stub 31 } 32 33 /** 34 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 35 */ 36 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 37 /* 38 DBUtilのcreateEntityManager()を実行しEntityManagerを作成し 39 EntityManager型の変数emを作成する*/ 40 EntityManager em = DBUtil.createEntityManager(); 41 42 // int型の変数pageを定義 43 int page; 44 try{ 45 /* 46 request.getParameterでpageをフォームから入手すしint型にキャストしたものを 47 先ほどの変数pageに入れる */ 48 page = Integer.parseInt(request.getParameter("page")); 49 // 例外処理(ErrorやRuntimeException以外の例外、別名検査例外とも呼ばれる) 50 } catch(Exception e) { 51 // 変数pageに1を入れる 52 page = 1; 53 } 54 55 //日報の全データを取得 56 List<Report> reports = em.createNamedQuery("getAllReports", Report.class) 57 // 検索結果を習得する最初のポジションを指定する 58 .setFirstResult(15 * (page - 1)) 59 // 習得する結果の最大件数を設定 60 .setMaxResults(15) 61 // SELECTクエリーを実行し問合せ結果を型のないリストとして返す 62 // getResultList()メソッドは一件以上取得する際に使用 63 .getResultList(); 64 65 //登録されている日報を数える 66 long reports_count = (long)em.createNamedQuery("getReportsCount", Long.class) 67 // SELECTクエリーを実行し問合せ結果を型のないリストとして返す 68 .getSingleResult(); 69 70 // ログインしたidをセッションスコープから取得 71 Employee login_employee = (Employee)request.getSession().getAttribute("login_employee"); 72 73 // List型のreportsのデータを一件ずつ取得したい 74 for(int i = 0; i <= reports_count - 1 ; i++){ 75 // reportsから一件の日報を取得してその日報の登録者のidを取得したい 76 Employee r_id = reports.get(i).getEmployee(); 77 78 // 取得した日報をフォローしているかのチェック 79 long followCheck = em.createNamedQuery("FollowedCheck", Long.class) 80 .setParameter("my_id", login_employee) 81 // 日報作成者のid 82 .setParameter("employee_id", r_id) 83 .getSingleResult(); 84 85 request.setAttribute("followChecks", followCheck); 86 } 87 88 // em(EntityManager)を閉じる 89 em.close(); 90 91 92 // 変数reportsをjspでreportsとして使えるようにする 93 request.setAttribute("reports", reports); 94 request.setAttribute("reports_count", reports_count); 95 request.setAttribute("page", page); 96 // ただ戻っただけなのに更新したflushなどが表示されないようにするため 97 // flushがnullでない時に実行 98 if(request.getSession().getAttribute("flush") != null) { 99 // flushをjspでflushで使えるようにする 100 request.setAttribute("flush", request.getSession().getAttribute("flush")); 101 // flusheをセッションスコープから削除 102 request.getSession().removeAttribute("flush"); 103 } 104 105 // /reports/index.jspをビューに指定する 106 RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/reports/index.jsp"); 107 // レスポンス画面としてjspファイルを呼び出す 108 rd.forward(request, response); 109 } 110 111}

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

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

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

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

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

plasticgrammer

2020/11/17 01:27

実現したいことをもう少し詳細に記載して頂けないでしょうか。 エラーの原因を知りたいのでしょうか? 「情報を取得する方法」とは?具体的に何をしたいのでしょうか?
hidaruma86

2020/11/17 01:40

List型の中身のemployee_idを取得したかったです修正しました。よろしくお願いします。 エラーの原因を教えていただけるだけでもありがたいと思っています。よろしくお願いします
guest

回答2

0

employee_id を取得するためには、クラスReportに下記のフィールド定義およびgetter/setterを作成すれば、自動的に格納されるものと思います。

java

1 @Column(name = "employee_id", nullable = false) 2 private Integer employeeId;

投稿2020/11/17 02:27

plasticgrammer

総合スコア629

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

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

hidaruma86

2020/11/17 02:58

ReportIndexServletで記述したEmployee r_id = reports.get(i).getEmployee();で入手可能ということで良いでしょうか?
plasticgrammer

2020/11/17 03:31

Reportクラスに前述のemployeeIdフィールドを作成し、getterまで作成したのであれば、 Integer empId = reports.get(i).getEmployeeId(); で参照できるかと。 そうでなければ、Employeeクラスの定義にもよりますが、 Employee emp = reports.get(i).getEmployee(); Integer empId = emp.getEmployeeId(); // Employeeクラスに定義がある前提 で入手できると思います。
hidaruma86

2020/11/17 04:01

なるほど。勉強になりますありがとうございます!
guest

0

ベストアンサー

「reports」はsetMaxResults(15) で15を指定しているので最大15件ですが、
「reports_count 」は取得件数の制限をしていないので15件以上取れているのかと推測。
for文は15回以上まわって16回目にきたときにreportsには16件目がなくてエラーになっているんだと思います。

拡張for文でreportsを全件処理するようにしたほうがインデックスを気にしなくてもよいと思います。

java

1for(Report report: reports){ 2 // reportsから一件の日報を取得してその日報の登録者のidを取得したい 3 Employee r_id = report.getEmployee(); 4 5--中略-- 6}

投稿2020/11/17 01:27

編集2020/11/17 01:29
storm3

総合スコア328

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

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

hidaruma86

2020/11/17 03:02

なるほど。。。Maxを指定してしまってのでreportsには15件しか入っていないがreport_countには15件以上入っていたので16となった時に取得できなくエラーになってしまったということであっていますでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問