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

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

ただいまの
回答率

87.49%

java500エラーについて

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 493

score 8

前提・実現したいこと

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

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


Report.java

package models;

import java.sql.Date;
import java.sql.Timestamp;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

@Table(name = "reports")
@NamedQueries({
    @NamedQuery(
            name = "getAllReports",
            // 全ての日報情報を取得
            query = "SELECT r FROM Report AS r ORDER BY r.id DESC"
            ),
    @NamedQuery(
            name = "getReportsCount",
            // 日報の前件数を取得
            query = "SELECT COUNT(r) FROM Report AS r"
            ),
    @NamedQuery(
            name = "getMyAllReports",
            // 自分の日報を先に登録した順番に並べ替える
            query = "SELECT r FROM Report AS r WHERE r.employee = :employee ORDER BY r.id DESC"
            ),
    @NamedQuery(
            name = "getMyReportsCount",
            // 指定された日報がすでにデータベースに存在しているかを調べる
            query = "SELECT COUNT(r) FROM Report AS r WHERE r.employee = :employee"
            ),
})
@Entity
public class Report {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    // @ManyToOneで多対一関連を定義
    @ManyToOne
    // @JoinColumnで統合に用いるカラムを指定
    @JoinColumn(name = "employee_id", nullable = false)
    private Employee employee;

    // date型は年月日のみ
    @Column(name = "report_date", nullable = false)
    private Date report_date;

    @Column(name = "title", length = 255, nullable = false)
    private String title;

    // @Lobとすることで改行もデータベースに保存される
    @Lob
    @Column(name = "content", nullable = false)
    private String content;

    @Column(name = "created_at", nullable = false)
    private Timestamp created_at;

    @Column(name = "updated_at", nullable = false)
    private Timestamp updated_at;

    @Column(name = "reaction_nice_cnt", nullable = false)
    private Integer reaction_nice_cnt;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Employee getEmployee() {
        return employee;
    }

    public void setEmployee(Employee employee) {
        this.employee = employee;
    }

    public Date getReport_date() {
        return report_date;
    }

    public void setReport_date(Date report_date) {
        this.report_date = report_date;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public Timestamp getCreated_at() {
        return created_at;
    }

    public void setCreated_at(Timestamp created_at) {
        this.created_at = created_at;
    }

    public Timestamp getUpdated_at() {
        return updated_at;
    }

    public void setUpdated_at(Timestamp updated_at) {
        this.updated_at = updated_at;
    }

    public Integer getReaction_nice_cnt() {
        return reaction_nice_cnt;
    }

    public void setReaction_nice_cnt(Integer reactio_nice_cnt) {
        this.reaction_nice_cnt = reactio_nice_cnt;
    }

}
HTTPステータス 500 - Index: 15, Size: 15
type 例外レポート

メッセージ Index: 15, Size: 15

説明 The server encountered an internal error that prevented it from fulfilling this request.

例外

java.lang.IndexOutOfBoundsException: Index: 15, Size: 15
    java.util.ArrayList.rangeCheck(ArrayList.java:653)
    java.util.ArrayList.get(ArrayList.java:429)
    controllers.reports.ReportsIndexServlet.doGet(ReportsIndexServlet.java:79)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    filters.LoginFilter.doFilter(LoginFilter.java:74)
    filters.EncodingFilter.doFilter(EncodingFilter.java:55)
注意 原因のすべてのスタックトレースは、Apache Tomcat/8.0.43のログに記録されています```  
エラーメッセージ  

ReportIndexServlet

package controllers.reports;  

import java.io.IOException;  
import java.util.List;  

import javax.persistence.EntityManager;  
import javax.servlet.RequestDispatcher;  
import javax.servlet.ServletException;  
import javax.servlet.annotation.WebServlet;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  

import models.Employee;  
import models.Report;  
import utils.DBUtil;  

/**  
* Servlet implementation class ReportsIndexServlet  
*/  
@WebServlet("/reports/index")  
public class ReportsIndexServlet extends HttpServlet {  
private static final long serialVersionUID = 1L;  

/**  
* @see HttpServlet#HttpServlet()  
*/  
public ReportsIndexServlet() {  
super();  
// TODO Auto-generated constructor stub  
}  

/**  
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)  
*/  
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
/*  
DBUtilのcreateEntityManager()を実行しEntityManagerを作成し  
EntityManager型の変数emを作成する*/  
EntityManager em = DBUtil.createEntityManager();  

// int型の変数pageを定義  
int page;  
try{  
/*  
request.getParameterでpageをフォームから入手すしint型にキャストしたものを  
先ほどの変数pageに入れる                                              */  
page = Integer.parseInt(request.getParameter("page"));  
// 例外処理(ErrorやRuntimeException以外の例外、別名検査例外とも呼ばれる)  
} catch(Exception e) {  
// 変数pageに1を入れる  
page = 1;  
}  

//日報の全データを取得  
List<Report> reports = em.createNamedQuery("getAllReports", Report.class)  
// 検索結果を習得する最初のポジションを指定する  
.setFirstResult(15 * (page - 1))  
// 習得する結果の最大件数を設定  
.setMaxResults(15)  
// SELECTクエリーを実行し問合せ結果を型のないリストとして返す  
// getResultList()メソッドは一件以上取得する際に使用  
.getResultList();  

//登録されている日報を数える  
long reports_count = (long)em.createNamedQuery("getReportsCount", Long.class)  
// SELECTクエリーを実行し問合せ結果を型のないリストとして返す  
.getSingleResult();  

// ログインしたidをセッションスコープから取得  
Employee login_employee = (Employee)request.getSession().getAttribute("login_employee");  

// List型のreportsのデータを一件ずつ取得したい  
for(int i = 0; i <= reports_count - 1 ; i++){  
// reportsから一件の日報を取得してその日報の登録者のidを取得したい  
Employee r_id = reports.get(i).getEmployee();  

// 取得した日報をフォローしているかのチェック  
long followCheck = em.createNamedQuery("FollowedCheck", Long.class)  
.setParameter("my_id", login_employee)  
// 日報作成者のid  
.setParameter("employee_id", r_id)  
.getSingleResult();  

request.setAttribute("followChecks", followCheck);  
}  

// em(EntityManager)を閉じる  
em.close();  


// 変数reportsをjspでreportsとして使えるようにする  
request.setAttribute("reports", reports);  
request.setAttribute("reports_count", reports_count);  
request.setAttribute("page", page);  
// ただ戻っただけなのに更新したflushなどが表示されないようにするため  
// flushがnullでない時に実行  
if(request.getSession().getAttribute("flush") != null) {  
// flushをjspでflushで使えるようにする  
request.setAttribute("flush", request.getSession().getAttribute("flush"));  
// flusheをセッションスコープから削除  
request.getSession().removeAttribute("flush");  
}  

// /reports/index.jspをビューに指定する  
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/reports/index.jsp");  
// レスポンス画面としてjspファイルを呼び出す  
rd.forward(request, response);  
}  

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • plasticgrammer

    2020/11/17 10:27

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

    キャンセル

  • hidaruma86

    2020/11/17 10:40

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

    キャンセル

回答 2

checkベストアンサー

+1

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

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

for(Report report: reports){  
    // reportsから一件の日報を取得してその日報の登録者のidを取得したい  
    Employee r_id = report.getEmployee();

--中略--
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/11/17 12:02

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

    キャンセル

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/11/17 11:58

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

    キャンセル

  • 2020/11/17 12:31

    Reportクラスに前述のemployeeIdフィールドを作成し、getterまで作成したのであれば、
    Integer empId = reports.get(i).getEmployeeId();
    で参照できるかと。

    そうでなければ、Employeeクラスの定義にもよりますが、
    Employee emp = reports.get(i).getEmployee();
    Integer empId = emp.getEmployeeId(); // Employeeクラスに定義がある前提
    で入手できると思います。

    キャンセル

  • 2020/11/17 13:01

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

    キャンセル

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

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る