Avatar billede shemeri Praktikant
22. oktober 2002 - 09:36 Der er 13 kommentarer og
2 løsninger

Fejl..NullPointerException

Hej,

Jeg har prøvet og find en NullPointerException
fejl i nedstående kode men kunne ik! Er der nogen der kan se fejlen :-)
-----------------------
import java.io.*;
import java.sql.*;

public class MakeConnection{

    Statement st;
    Connection con;
    ResultSet result;

    public MakeConnection()
    {
    }

    //Method to make connection to mysql RaceRunner database
    public void GetConnection(){
        /* connect (commented out strings use classic MySQL driver) */
        try {
            Class.forName("org.gjt.mm.mysql.Driver");
            this.con = DriverManager.getConnection("jdbc:mysql://localhost/RaceRunner", "shemeri", "racerunner");

        }

        catch (java.sql.SQLException e){
            System.out.println("ERROR" + e);
        }

        catch (Exception e) {
            System.out.println("ERROR" + e);
        }
    }


    public void close(){

        if (this.con!=null){


        try
          {
            this.con.close();
            this.con=null;
            }//try

        catch (SQLException e)
                {
                    e.printStackTrace(System.out);
                }//catch
        }//if
    }//close()


    public void MakeRegister(String RegisterStatement){
        GetConnection();

        if(this.con!=null){

        try {
                this.st = this.con.createStatement();
                this.st.executeUpdate(RegisterStatement);
            }

          catch (Exception e) {
                System.out.println("ERROR" + e);
        }
        }//if

    }

    public void MakeQuery(String QueryStatement){
        GetConnection();
       
        if(con!=null){
           
            try {
                this.st = this.con.createStatement();
                this.result = this.st.executeQuery(QueryStatement);
                }

            catch (Exception e) {
                System.out.println("ERROR" + e);
            }
        }//if


    }

    public ResultSet Result(){
       
        return this.result;
    }


}

------------------------------------
500 Servlet Exception
java.lang.NullPointerException
    at _test2__jsp._jspService(/test2.jsp:13)
    at com.caucho.jsp.JavaPage.service(JavaPage.java:75)
    at com.caucho.jsp.Page.subservice(Page.java:485)
    at com.caucho.server.http.FilterChainPage.doFilter(FilterChainPage.java:182)
    at com.caucho.server.http.Invocation.service(Invocation.java:312)
    at com.caucho.server.http.CacheInvocation.service(CacheInvocation.java:135)
    at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:221)
    at com.caucho.server.http.HttpRequest.handleConnection(HttpRequest.java:163)
    at com.caucho.server.TcpConnection.run(TcpConnection.java:137)
    at java.lang.Thread.run(Thread.java:536)
-------------------------------------

jeg har prøvet og køre denne jsp fil:

<%@page import="java.sql.*"%>

<jsp:useBean id="Connection" scope="session" class="MakeConnection" />

<%
String Person;

             
          Person  = "SELECT * from person WHERE Person_ID = 101";

              Connection.MakeQuery(Person);   
             
              while (Connection.Result().next()){
             
              out.println(Connection.Result().getString(1));
              out.println(Connection.Result().getString(2));
              out.println(Connection.Result().getString(3));
              out.println(Connection.Result().getString(4));
              }
Avatar billede disky Nybegynder
22. oktober 2002 - 10:38 #1
du behøves ikke at skrive this. foran klasse variabler.

Jeg ville også lade være med at kalde flere metoder i røven af hinanden, men det skulle bare gavne overskueligheden.

Man catcher heller ikke Exception, men altid den exception man kan få.

p.s. angiv altid kolonner med deres navn og ikke deres pos,
prøv i din MakeQuery() at udskriv resultset bare for at se om den bliver til noget efter kaldet til database.
Avatar billede caspermadsen Nybegynder
22. oktober 2002 - 13:02 #2
500 Servlet Exception
java.lang.NullPointerException
    at _test2__jsp._jspService(/test2.jsp:13)

(Findes person_id 101??? Hvis ikke kunne det være fejlen.)

Tja, så vidt jeg kan se ud fra din stacktrace burde du kigge på din while loop der er på linie 13 i din jsp side hvor du får fejlen. Det er ikke nødvendig vis der det er galt, men det er et godt sted at begynde! :)

Generelt skriver man dog ALDIG database specifik kode i JSP, da man bør følge en model 2 MVC pattern. Hvis du gør det ville du kunne finde dine fejl som compile time fejl, og ikke runtime fejl som dem jsp viser.

Held og lykke med det! :)
Avatar billede disky Nybegynder
22. oktober 2002 - 13:16 #3
Casper:
Hvis du tror du finder fejl på compiletime ved brug af mvc istedet for på runtime bliver du MEGET MEGET skuffet.

En NullPointerException er IKKE en compiler fejl, men en runtime fejl.

En JSP side bliver altså compilet første gang den bliver brugt, og det kommer til udtryk på en helt anden måde hvis der er compiler fejl.

Så tilbage til bogen :-)
Avatar billede caspermadsen Nybegynder
22. oktober 2002 - 13:32 #4
Disky:
Du må undskylde jeg udtrykte mig for kort, og åbenbart for upræcist...

Det jeg prøvede på at sige var, at hvis man benytter MVC pattern ville man i sin model kunne tage højde for null's og de viewbeans man sender til jsp siden ville derved KUN kunne indholde strenge, eller tomme strenge ("") ved null. På denne måde slipper man for MANGE timers fejlfinding og nullpointers fejl.
Avatar billede disky Nybegynder
22. oktober 2002 - 13:44 #5
så er vi enige.

Men alle de ting du kan gøre hvis du bruger et MVC pattern, kan du også godt gøre i en JSP side :-)

At et MVC pattern så er bedre kode er en helt anden ting :)
Avatar billede caspermadsen Nybegynder
22. oktober 2002 - 13:57 #6
Disky:
Selvfølgelig er vi enige! Jeg har jo læst mange bøger! :)

Men jeg vil STÆRKT fraråde at lave det hele i en JSP side, også selvom det er en helt anden ting! :)
Avatar billede shemeri Praktikant
22. oktober 2002 - 14:01 #7
tak for jers hjælp nu virker det...men efter jeg har rettet fejlen, kom der en anden fejl...

ResultSet result;

public int MakeRegister(String NewRegisterStatement){


        if(con!=null){

        try {
                st = con.createStatement();
                result = st.executeUpdate(NewRegisterStatement);
            }

          catch (Exception e) {
                System.out.println("ERROR" + e);
        }
        }//if

        return 0;

    }
----------------------
NewRegisterStatement er jo string som den sku være men jeg får en fejl der ser sådan ud:
WEB-INF\classes\MakeConnection.java:60: incompatible types
found  : int
required: java.sql.ResultSet
                result = st.executeUpdate(NewRegisterStatement);
Avatar billede disky Nybegynder
22. oktober 2002 - 14:04 #8
executeUpdate returnerer altså kun en int, executeQuery returnerer et ResultSet.

Se API'en
Avatar billede soelvpil Nybegynder
22. oktober 2002 - 22:49 #9
public int MakeRegister(String NewRegisterStatement){
  int numberOfRowsAffected = 0;
  if(con!=null){
    try {
        st = con.createStatement();
        numberOfRowsAffected = st.executeUpdate(NewRegisterStatement);
    }
    catch (Exception e) {
      System.out.println("ERROR" + e);
    }
  }//if
  return numberOfRowsAffected;
}



En lille komentar til dit design.

I stedet for at gemme ResultSet som en instansvariabel på klassen, bør du returnere den fra metoden, så makeQuery returnerer resultsettet. Hermed bliver din jsp-kode noget med

ResultSet result = Connection.MakeQuery(Person);   
while (result.next()){
  out.println(result.getString(1));
  out.println(result.getString(2));
  out.println(result.getString(3));
  out.println(result.getString(4));
}

Hermed undgår du mystiske fejlbeskeder. Tager jeg f.eks. fejl hvis jeg antager at din NullpointerException skyldes at din query på databasen fejlede, så result-variablen aldrig blev sat på klassen?

Hvis det var mig, ville jeg slet ikke fange nogen Exception i makeQuery-metoden men bare kaste den videre. Så ved den kode der itererer hen over resultsettet nemlig om der er gået noget galt, så der slet ikke er noget at iterere hen over.
Avatar billede disky Nybegynder
23. oktober 2002 - 07:35 #10
soelvpil:
En grim ting i dit design.

Man laver ALDRIG result.getString(x) hvor x er kolonne nummer, hvis du pludselig fjerner eller indsætter en kolonne i din tabel går det hele kaput. Et vel designet program bruger navnet på kolonnen istedet, derved opnår man overskuelig og let vedligeholdbar kode.
Avatar billede caspermadsen Nybegynder
23. oktober 2002 - 10:13 #11
Er det bare mig eller er det en dårlig idé i det hele taget at behandle resultset etc. i jsp. Jeg ville da foretrække en iterator. I jsp koden vil jeg da også gerne undgå out.println's... Men det må være et oplæg til en diskution et andet og mere relevant sted. Ellers er jeg helt enig med disky, at kolonne numre bør undgås. Det kommer dog an på hvad man laver.
Avatar billede disky Nybegynder
23. oktober 2002 - 10:26 #12
Hvis det skal være rigtigt pænt det du laver, laver JSP siden ikke andet end at kalde get metoder, selve iterationen foregår i en Bean.

I hvilket tilfælde ville det ikke være smart at bruge kolonne navne frem for nummer ?
Avatar billede soelvpil Nybegynder
23. oktober 2002 - 18:19 #13
disky: jeg er helt enig i, at man bør bruge kolonnenavne (også selvom indeks vist nok er marginalt hurtigere). Den eneste grund til, at der stod indeks i min kode, er at det blev kopieret fra det oprindelige spørgsmål (dovenskab).

Jeg ville heller aldrig selv  tilgå databasen direkte fra en jsp-side. Mit budskab med eksemplet var dog, at traversering af resulætset, samt håndtering af sqlException skal ske sammen, og jeg var lidt for doven til at lave et eksempel med at opsamle resultat i en Collection, som jsp-siden itererer over (men måske burde jeg så have været så doven at jeg helt holdt min kæft?)  (-:
Avatar billede disky Nybegynder
23. oktober 2002 - 18:25 #14
soelvpil: Bare roligt :)
Avatar billede shemeri Praktikant
25. oktober 2002 - 17:40 #15
tak PEOPLE....hvordan dele jeg point?! ;-)
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