Just nu i M3-nätverket
Jump to content

felmed.


Tony_t96tli

Recommended Posts

"unreported exception java.sql.SQLException; must be caught or declared to be thrown"

 

Jag har en fil i java där anropet till databasen är ok, i en annan fil får jag ovan och nedan ^ felmeddelande. 6 error alla pekar på parentesen.

 

Class.forName("org.gjt.mm.mysql.Driver");

^

Jag tycker jag har alla import man kan tänka sig.

***********

import javax.mail.*;

import javax.mail.internet.*;

import java.util.*;

import java.net.*;

import java.io.*;

import javax.mail.event.*;

import javax.activation.*;

import java.sql.*;

import javax.servlet.http.*;

import javax.servlet.*;

import javax.naming.InitialContext;

import org.jdom.output.XMLOutputter;

import org.jdom.input.SAXBuilder;

import org.jdom.JDOMException;

class SendXmlSms1

{

public static void main(String args[])

{

 

try {

while (true){

****************

 

Tack

 

/Tony_t96tli

 

[inlägget ändrat 2003-09-29 17:26:08 av Tony_t96tli]

Link to comment
Share on other sites

Du saknar helt enkelt en try catch sats runt denna rad, alternativt en catch som fångar just java.sql.SQLException.

 

[inlägget ändrat 2003-09-29 17:30:34 av bool]

Link to comment
Share on other sites

Måste man lägga det runt varje, dvs alla 6 st felen.

 

Class.forName("org.gjt.mm.mysql.Driver");

Connection addConn = DriverManager.getConnection("jdbc:mysql:///blekinge");

Statement addStmt = addConn.createStatement();

String qry = "INSERT INTO mms (message, filename, from_, to_, subject, timesend, messagequantity) VALUES ('meddelanden', 'bild.jpg', 'Sture Andersson', 'Tony Lind', 'hoj', '0', '1007098')";

 

addStmt.executeUpdate(qry);

addStmt.close();

addConn.close();

 

?

 

Tack

 

Link to comment
Share on other sites

Nej, du kan ha en try catch som fångar precis allt skräp som kommer men det är väl tveksam design kanske.

 

Får inget grepp på hur det ser ut nu med de korta raderna du postar.

 

Link to comment
Share on other sites

Denna funkar i ena....

 

try

{

Class.forName("org.gjt.mm.mysql.Driver");

Connection addConn = DriverManager.getConnection("jdbc:mysql:///blekinge");

Statement addStmt = addConn.createStatement();

String qry = "INSERT INTO mms (message, filename, from_, to_, subject, timesend, messagequantity) VALUES ('meddelanden', 'bild.jpg', 'Sture Andersson', 'Tony Lind', 'Akut', '0', '1007098')";

 

addStmt.executeUpdate(qry);

addStmt.close();

addConn.close();

} catch (NullPointerException e) {}

 

men ej i en annan javafil.

 

 

Link to comment
Share on other sites

Det du gör där är att fånga alla NullPointerExceptions, det du måste göra är att fånga de exceptions som funktionerna du ropar på kan kasta. När det gäller JDBC-anropen så är det oftast java.sql.SQLException men när det gäller Class.forName() är det ett annat.

 

Lästips: http://java.sun.com/docs/books/tutorial/essential/exceptions/index.html

[inlägget ändrat 2003-09-29 17:41:51 av fhe]

Link to comment
Share on other sites

Tack, jag har hittat ett par...

 

När använder man vilken och varför?

 

catch (InterruptedException e)

 

catch (Exception e)

 

catch (IOException e)

 

catch (NullPointerException e)

 

Måste man ha flera eller tar de ut varandra?

 

Tack

 

Link to comment
Share on other sites

Jag menar exakt vad jag skriver. Du förväntas fånga java.sql.SQLExceptions när du ropar på jdbc-funktioner, NullPointerExceptions är ointressanta sålänge inte någon av de rutiner du ropar på kastar sådana.

 

Jag tänker inte skriva om din kod så att den blir rätt, det är mycket bättre att du surfar till java tutorialen och lär dig vad ett exception är och varför du behöver bry dig.

 

I princip så är det så här:

För att tvinga dig att skriva kod som faktiskt hanterar fel och inte bara kraschar när nåt inte är som du förväntar dig så har java en tvingad undantagshantering.

Om jag skriver en metod och konstaterar att "Den här borde fungera, så länge inte min anslutning till databasen försvinner" så kommer jag förmodligen att deklarera min metod som "throws java.sql.SQLException" och därmed talar jag om för kompilatorn att den som ropar på funktionen måste fånga och hantera ett sådant fel/undantag.

 

Om jag nu byter roll och istället är den slarviga utvecklare som inte fattar att felhantering är rätt viktigt så ropar jag på metoden enligt följande:

 

klassen.minDatabasfunktion(dbconn, 2);

 

Resultatet kommer då att bli att kompilatorn säger åt mig att:

"exception java.sql.SQLException; must be caught or declared to be throw"

 

Dvs, "Hörru! Du måste ta hand om sådana fel som kan inträffa, i det här fallet ett SQLException".

 

Alltså måste jag skriva om min kod så att den istället ser ut t.ex så här:

try {
klassen.minDatabasfunktion(dbconn, 2);
} catch(SQLException sqlEx) {
System.err.println("Någonting gick helt fel i kontakten med databasen");
 // Här skriver du kod som t.ex kopplar ner anslutningen, osv
}

 

Jag har nog sagt det förut men iaf, du borde verkligen läsa något om grunderna i java. Att i blindo kasta sig ut och skriva applikationer som använder jdbc utan att kunna det mest grundläggande är dumt. Gör du fel (utan att veta bättre) så kommer du förmodligen inte bara att sänka dit eget program utan kan förmodligen även sänka databasen (om du har otur och läcker anslutningar, cursors etc).

[inlägget ändrat 2003-09-29 18:04:50 av fhe]

Link to comment
Share on other sites

Tack båda =)

 

catch (Exception e)

{

e.printStackTrace();

}

 

gjorde susen nederst.

Fast jag vet fortfarande inte riktigt.

 

Tack

 

/Tony

 

Link to comment
Share on other sites

Så kan du som sagt göra (eftersom alla Exceptions ärver Exception) men jag skulle absolut avråda dig från att göra det "runt all kod" och sen bara skriva ut en stacktrace.

Om du i ditt exempel får felet på raden

Statement addStmt = addConn.createStatement();

så kommer du aldrig att köra raden

 addConn.close();

och då kommer du att läcka en anslutning (och allt som är skapat av anslutningen i form av statements, cursors etc).

 

Ha gärna en stor try-catch runt all kod men då ska du vara mycket medveten om vilken kod som måste köras i catch-blocket. Att fånga Exception bara är i allmänhet en rätt dum idé eftersom du inte har en aning om ifall det var ett databas-exception eller nåt annat men det går ju att kolla i efterhand.

 

Link to comment
Share on other sites

Jag ska alltså sätta fler och mer intimt med där felet kan uppstå, så korrigering kan ske/koppla ned eller något, om något innan felet trots allt lyckats. Och släpps i luften.

 

Vad händer om man håller saker kvar i "luften" minnesbrist, läckage som gör att ett senare försök att koppla upp kraschar, om man har while, och försöker koppla upp med samma namn???

 

 

Tack

 

Link to comment
Share on other sites

Jag ska alltså sätta fler och mer intimt med där felet kan uppstå

 

Antingen det (vilket jag inte rekomenderar) eller också ser du helt enkelt till att fånga de fel som kan inträffa samtidigt som du håller koll på vad som är öppnat och inte. I just ditt fall så skulle jag t.ex sätta "addStmt = null" initialt och i catch (eller finally) göra addStmt.close() endast om addStmt!=null. Samma sak med addConn.close(), då kan catchen stå kvar.

 

Vad händer om man håller saker kvar i "luften" minnesbrist, läckage som gör att ett senare försök att koppla upp kraschar

Exakt vad som händer beror lite på, läcker du databas-connections så brukar det resultera i att du förr eller senare inte får ansluta (om databasen har ett tak på hur många samtidiga anslutningar du får ha). Läcker du cursors (resultset:s) så kan det (på t.ex en Oracle) resultera i att du inte får ställa fler frågor till databasen efter ett tag.

Men framförallt så tar du resurser från databas-servern helt i onödan, grunden i all programmering är att man städar upp efter sig (alternativt har någon annan som gör det, t.ex en gc för minnesallokeringar) allt annat är usel programmering.

 

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...