Avatar billede pointwood Nybegynder
31. maj 2000 - 11:48 Der er 7 kommentarer og
1 løsning

Servlet - NullPointerException

Når jeg prøver at køre nedenstående servlet, så får jeg en NullPointerException i linien jeg har markeret med ">>".

Jeg har ingen anelse om hvorfor :-(

Source code:

//Import Servlet Libraries
import javax.servlet.*;
import javax.servlet.http.*;

//Import Java Libraries
import java.util.*;
import java.sql.*;
import java.io.*;

public class dbpool extends HttpServlet {

  int limit = 2;        //Set initial limit to 2
  int users = 0;        //Track user count with this variable

  Vector db_v;          //Vector to manage connections
  Vector db_status;    //Vector to keep track of open connections

  public void init() throws ServletException {

    /* Create initial pool of database connections */
    try {
      db_v = new Vector();
      db_status = new Vector();
      Class.forName(getInitParameter("JdbcDriver"));
      String dbURL = getInitParameter("dbURL");
      for (int i=0; i<limit; i++) {
        db_v.addElement(DriverManager.getConnection(dbURL));
        db_status.addElement("0"); // "0" - Available Connection
      }
    }
    catch (Exception e) {
      System.out.println("Ex33:Database connect failed (init)");
      System.out.println(e.toString());
      return;
    }

  }

  public void doGet(HttpServletRequest _req, HttpServletResponse _res)
    throws ServletException, IOException {

    _res.setContentType("text/html");
    PrintWriter out = _res.getWriter();

    /* If necessary, add a new connection */
    users++;
    if (users > limit) {
      if(!addConnection()) {
        _res.sendError(_res.SC_ACCEPTED, "The request has been accepted, but it failed to complete due to an error connecting to the database.");
        return;
      }
    }

    /* Assign to an open database connection object */
    boolean found = false;
    int i = 0;
    String val = "";
    while (!found) {
>>      val = (String)db_status.elementAt(i);
      if (val.equals("0")) {
        found = true;
      }
      else {
        i++;
      }
    }
    Connection dbCon = (Connection)db_v.elementAt(i);
    db_status.setElementAt("1", i);

    /* Do some database stuff..... */
    String count = "";
    try {
      Statement s = dbCon.createStatement();
      ResultSet rs = s.executeQuery("select count(*) from dailySales");
      if (rs.next()) {
        count = rs.getString(1);
        Thread.sleep(500);  // Simulate a pause for testing purposes
      }
    }
    catch (SQLException e) {
      _res.sendError(_res.SC_ACCEPTED, "The request has been accepted, but it failed to complete due to an error updating the database.");
      System.out.println(e.toString());
      return;
    }
    catch (InterruptedException e) {
      // Necessary for testing purposes (Thread.sleep() method)
    }

    //Return some results.....

    out.println("<HTML>");
    out.println("<HEAD>");
    out.println("<TITLE>Database Pooling Test Results</TITLE>");
    out.println("<BODY>");
    out.println("Database Operation: Table Count - " + count + " records");
    out.println("<br>User Count: " + String.valueOf(users));
    out.println("<br>Threshhold: " + String.valueOf(limit));
    out.println("</BODY>");
    out.println("</HTML>");

    out.close();

    /* Reset user count to free up connection object */
    users--;
    db_status.setElementAt("0", i);

  }

  public boolean addConnection() {

    /* Create another database connection */
    try {
      String dbURL = getInitParameter("dbURL");
      db_v.addElement(DriverManager.getConnection(dbURL));
      db_status.addElement("0"); // "0" - Available Connection
      limit++;
    }
    catch (Exception e) {
      System.out.println("Ex33: Database connect failed (addConnection)");
      System.out.println(e.toString());
      return false;
    }

    return true;

  }

  public void destroy() {

    /* Close database connections */
    try {
      Enumeration enum = db_v.elements();
      while (enum.hasMoreElements()) {
        Connection dbCon = (Connection)enum.nextElement();
        dbCon.close();
      }
    }
    catch (Exception e) {
      System.out.println("Ex33:Error closing database (destroy)");
      System.out.println(e.toString());
    }

  }

}
Avatar billede kobojt Nybegynder
31. maj 2000 - 12:40 #1
Prøv at se to linier oppe

String val = "";

Jeg tror det er her det går galt, prøv istedet kun at erklærer din variable og ikke initialisere den til "null".
Sådan her:

String val;

Kobojt
Avatar billede erikjacobsen Ekspert
31. maj 2000 - 12:44 #2
det sker der nok ikke så meget ved kobojt.
Men det er nok værre at du måske løber ud
over "kanten", hvis der ikke er nogen, eller
du ikke finder den du leder efter. Jeg ikke
på stående fod navnet på metoden, du skal bruge:

while (!found && i<db_status.AntalAfposterdererblevetreturneret()) {
  val = (String)db_status.elementAt(i);
    if (val.equals("0")) {
      found = true;
Avatar billede pointwood Nybegynder
31. maj 2000 - 13:11 #3
Jeg er kommet lidt videre - metoden du hentyder til (db_status.AntalAfposterdererblevetreturneret()), hedder size.

Det gav mig dog samme fejl, hvilket fik mig til at prøve at tjekke om der overhovedet var noget i den Vector der testes (gjort ved at køre metoden "isEmpty").
Den returnerede "true" (den er tom), så åbenbart bliver der slet ikke fyldt noget i den Vector!?
Avatar billede erikjacobsen Ekspert
31. maj 2000 - 13:15 #4
Min "løsning" er kun halvvejs... Hvis man så
ikke finder det man leder efter, må den
jo nok ikke bruge "i" til at slå op med
efterfølgende. Men som du selv siger skal
der nok fyldes noget i.

"size" - ja det er jo nemmere at skrive.
Avatar billede erikjacobsen Ekspert
31. maj 2000 - 13:18 #5
Hvordan er det nu? Gør det en forskel at skrive:

public void init() throws ServletException {
  db_v = new Vector();
  db_status = new Vector();

  /* Create initial pool of database connections */
  try {
...
Avatar billede pointwood Nybegynder
31. maj 2000 - 13:41 #6
Det hjalp lidt - jeg nåede 8 linier længere ned.

Der hvor der står
Connection dbCon = (Connection)db_v.elementAt(i);

giver mig følgende exception: java.lang.ArrayIndexOutOfBoundsException: 0 >= 0

Avatar billede pointwood Nybegynder
31. maj 2000 - 13:43 #7
Lige lidt info om ElementAt metoden:

elementAt
public Object elementAt(int index)
Returns the component at the specified index.
This method is identical in functionality to the get method (which is part of the List interface).

Parameters:
index - an index into this vector.
Returns:
the component at the specified index.
Throws:
ArrayIndexOutOfBoundsException - if the index is negative or not less than the current size of this Vector object. given.
Avatar billede erikjacobsen Ekspert
13. juli 2000 - 13:52 #8
Hmm, jeg tror jeg glemte spørgsmålet i ekspertens mail-problemer. Jeg håber du
har fundet ud af det ;--)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester