سؤال

مشكلتي هي أنه يتعين علي تعيين متغير في بيان المحاولة وإلا أحصل على خطأ في التجميع.

في وقت لاحق ، أحتاج إلى استخدام هذا المتغير ولكنه الآن خارج النطاق ، أو هكذا أعتقد. أقوم بتهيئة المتغير خارج بيان المحاولة وأعطيته على Null ، اعتقدت أنه قد يكون من الممكن الوصول إليه في الخارج ، لكنني ما زلت أحصل على ملف NullPointerException.

الكود أدناه ، مع إخراج الكثير منها لتسهيل القراءة - أعرف أنها رمز سيء ، لكنني جديد على Servlets وأردت فقط رؤيته يعمل مع جميع الأجزاء المتحركة التي تفترض أن تكون كذلك.

لقد قمت بإنشاء فئة أخرى تقوم بالاتصالات التي تم إنشاؤها (...) وتمر في المعلمات المطلوبة ، وهي تعمل بشكل جيد. هذا يجعلني أشعر بالفضول لسبب الاتصال rs.getString("name") انا حصلت على NullPointerException, ، لأن هذا هو بالضبط ما أقوم به من الفصل الآخر (تشغيل من طريقة رئيسية للراحة) ويعمل كما هو متوقع.

المتغير المعني هو متغير ResultSet "RS" -

public class AgReportServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    public AgReportServlet() {
        super();
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ResultSet rs = null;
        try {
            rs = docs.getDocs(con, start, end, zone, locality);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        response.setContentType("text/xml");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n" +
                out.println(
                        "<table border=\"0\" cellspacing=\"0\" cellpadding=\"6\">\n");

        // I have a resultset object need to iterate through it to display the file names

        try {
            while (rs.next()) { // page through the result set

                out.println(
                        "  <tr>\n" +
                                "    <td>: " + rs.getString("name") + "</td>\n" +
                                "  </tr>\n"
                );
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        out.println(
                "</table></body>\n" +
                        "</html>"
        );

        out.flush();
        out.close();
    }
}
هل كانت مفيدة؟

المحلول

مشكلتك هي أنه إذا كان هذا البيان:

rs = docs.getDocs(con, start, end, zone, locality);

يلقي استثناء ثم لا تزال قيمة RS null. لذا فإن ما سأفعله هو تحريك الحلقة داخل نفس كتلة المحاولة. بدلاً من ذلك ، يمكنك التحقق مما إذا كان لا يزال فارغًا قبل محاولة استخدامه.

إن تعيين القيمة على NULL خارج كتلة المحاولة ليس رمزًا سيئًا. هذا فقط ما عليك فعله إذا كنت تريد متغير RS خارج كتلة Try (ويشمل ذلك داخل إحدى جمل الصيد). RS الخاص بك بينما يجب أن تكون الحلقة فقط في نفس كتلة المحاولة.

نصائح أخرى

الطريقة التي تعلن أن متغير RS ومجموعة المحاولة/الصيد الأولى على ما يرام.

إنه فقط بعد المحاولة الأولى/التقاطك ، تحتاج إلى تذكر أن RS سوف ساكن كن فارغًا إذا كان هناك خطأ في المحاولة الأولى/الصيد. لذا فقط تأكد من اختبار RS لـ NULL قبل أن تحاول الوصول إليه.

لماذا لا تضيف ببساطة

if(rs != null)

قبل

while(rs.next())

هذا يجب أن يساعد (بقدر ما أفهمه)

شكرا للجميع على مساعدتك. لقد ساعدتني أولاً في تحديد أنه يجب أن يكون هناك نوع من الاستثناء. عندما نظرت إلى وحدة التحكم في Tomcat ، كان بإمكاني أن أرى أنه لم يكن خطأ في الصناديق لموصل MySQL. لقد أدرجت ذلك في مشروعي ، ولكن ليس في المشروع نفسه - لقد أشرت إليه بتكاسل في دليل LIB الخاص بي ، لذلك في النهاية ، تسبب الاستثناء في المشكلة ، ولكن باستخدام اقتراحاتك مثل (RS! = NULL) ساعدني في الحصول على إلى السبب الجذري.

في البداية اعتقدت أنه كان له علاقة بالمتغير الذي كان خارج النطاق. من الواضح أن هذا لم يكن كذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top