0

だから私はMVCパターンに従ってウェブサイトを構築しています。Eclipse/Tomcat を使用しています。

DB から投稿を取得する PostAccess クラスがあり、PostBean アイテムを含むベクターを作成します。サーブレットはベクトルをjspファイルに渡し、jspファイルはhtmlなどを作成します。

私の問題は、複数のスレッドがベクターと対話しているため、Eclipseでこれを取得することです:

java.util.NoSuchElementException
at java.util.Vector$Itr.next(Unknown Source)

グーグルで学んだように、このエラーは、ベクトルを編集するスレッドを同期していないために発生します。

しかし、正確にはどこで同期を行うべきですか?

このコードは私の PostAccess クラスにあります:

public synchronized Vector<Post> RetrievePosts() throws SQLException
{

ベクトル c = (ベクトル)(新しいベクトル());c を返します。}

これは私のサーブレットクラスにあります:

public synchronized  void process(ServletContext servletContext,HttpServletRequest request, HttpServletResponse response) 
{
    Vector<Post> c = (Vector<Post>)(new Vector<Post>());

    try {
        PostDAO pDAO=new PostDAO(servletContext);

        c=(Vector<Post>) pDAO.RetrievePosts();

    } catch (ClassNotFoundException | SQLException e) {

        e.printStackTrace();
    }
    request.setAttribute("posts", c);
}

これは私のjspにあります:

<% Vector<Post> c =(Vector<Post>)request.getAttribute("posts");

Iterator<Post> i = c.iterator();  
herePost p=(Post)i.next();


                        while (!c.isEmpty()) { %>
4

1 に答える 1

0

ベクターがプロセスメソッド内で宣言されていることを示すコードのように、2つのスレッドが同じベクターで動作しているとは思わない(doGetによって呼び出されるものであると想定しています)。リクエストの処理。したがって、PostAccess で何か非常にファンキーなことが起こっていない限り、Vector をスラッシングするスレッドを除外できると思います。

ただし、これが問題の原因である可能性があるようです。

Iterator<Post> i = c.iterator();  
herePost p=(Post)i.next();

ベクトルが最初から空である場合、 isEmpty() テストが後で行われるため、 java.util.NoSuchElementException が発生します。

于 2013-02-05T00:27:05.160 に答える