Exception wird nicht aufgefangen

7bkahnt

Aktives Mitglied
Hallo,
ich habe eine webbasierte Anwendung, welche ein Tabelle aus einer DB ausliest und dem Benutzer anzeigt. Dieser kann dann Datensätze z.B. bearbeiten.
Er klickt auf bearbeiten und bekommt den gewählten DS zu Gesicht. Dann nimmt er Änderungen vor und klickt auf Ändern. Somit wird der DS geupdatet.

Nun zu meinem Problem.
Ich möchte dem Problem, dass zwei oder mehrere Nutzer den gleichen DS bearbeiten können, aus dem Weg gehen.

Ersteinmal der Quellcode:

CrudAction.java:

Java:
public String edit()
	{
		 Integer userid=(Integer)session.get("userObject");   
		 HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);
		 crud = crudDAO.listCrudById(Long.parseLong(request.getParameter("id")));
		try {
			lockDAO.lockCrud(Long.parseLong(request.getParameter("id")),userid); 
		} catch (Exception e) {

			System.out.println("FEEHLER");
			
		}
		   
		return SUCCESS;
	}

lockdao ist bei mir so deklariert:
Java:
private LockDAO lockDAO = new LockDAOImpl();
während LockDAO ein Inteface ist.
Er geht also mit lockDAO.lockCrud() in die Klasse LockDAOImpl und führt dort die lockCrud() aus.



CrudDAOImpl.java:

Java:
@Override
	public void lockCrud(Long auswahlid,Integer userid) throws Exception {
		Lock lock = new Lock();
		System.out.println("lockCrud()");
		Calendar cal = Calendar.getInstance();
		DateFormat df = DateFormat.getDateTimeInstance();
		String zeit=df.format(cal.getTime());
		System.out.println(zeit);
		
		lock.setId(auswahlid);
		lock.setZeit(zeit);
		lock.setId_sb(userid);
		session.save(lock);
	}




Wenn Nutzer A also Bearbeiten klickt, geht er in die edit()-Methode, welche lockCrud() aufruft.
Dort wird die ID des Nutzers, sowie die ID des ausgewählten Datensatzes in eine Lock-Tabelle geschrieben. Die Spalte "ID", in welche die ID´s der Datensätze kommen ist Unique.
Wenn jetzt also Nutzer B ebenfalls den gleichen DS bearbeiten will, klickt er auf Bearbeiten und geht wiederum in die lockCrud().
Dort versucht er wieder in die Tabelle einen Eintrag zu machen. Da aber die ID des Datensatzes schon vorhanden ist kommt es nun zur Exception.
Diese soll geworfen werden und die edit()-Methode soll die Exception auffangen. Im catch-Block soll dann eine Methode aufgerufen werden, welche dem Nutzer den Hinweis gibt, dass der DS gerade bearbeitet wird.

Aber irgendwie geht er nie in den catch-Block rein und schreibt mir somit auch nie FFEEHHLER aus
Habt ihr vielleicht einen Tipp woran das liegen könnte?.

Der Fehler der in der console ausgeschrieben wird:

Java:
Hibernate: insert into Lock_t (ID_SB, ID) values (?, ?)
Error! Please, check your JDBC/JDNI Configurations and Database Server avaliability. 
 Could not commit the Hibernate Transaction: Could not execute JDBC batch update
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update

Caused by: java.sql.BatchUpdateException: ORA-00001: Unique Constraint (SYSTEM.LOCK_T_UK2) verletzt
org.apache.catalina.core.StandardWrapperValve invoke
SCHWERWIEGEND: Servlet.service() for servlet default threw exception
java.lang.IllegalStateException

Ich hatte es auch mit mehreren Exceptions probiert, wie IOException oder auch die IllegalStateException, die ja laut Fehlermeldung (s. oben) sogar geworfen wird.
Aber irgendwie lässt sich nichts abfangen.
 
Zuletzt bearbeitet:
S

SlaterB

Gast
du hast keine weiteren Informationen wie StackTrace?

versuche an höheren Stellen, z.B. direkt im Servlet ein try/catch, falls wirklich ein Servlet beteiligt ist, wie die Fehlermeldung andeutet,
vielleicht tritt die Exception an anderen Aufruf-Stellen auf

ganz schick wäre auch ein Test in einem normalen Java-Programm mit main-Methode, statt komplizierter Web-Umgebung
 

FArt

Top Contributor
Die Lösung ist einfach: die Methode wirft keine Exception oder wie wird bereits vorher verabeitet.

Tipp: throws Exception ist ganz schlechter Stil, genau so ein catch auf Exception. Hier wäre sogar eine eigene Exception (z.B. AlreadyLockedException) sinnvoll, die noch spezielle Informationen enthält, wie z.B. der Datensatz (ID) um den es geht usw.
Eigentlich wäre es noch sinnvoller, gar keine Exception zu werfen, sondern einen Status zurückzugeben, denn dass ein Datensatz gesperrt ist, ist keine Ausnahme, sondern ein möglicher Status des Locks.
 
S

SlaterB

Gast
ach ja, jetzt fällt mir wieder ein, dass das SQL, was hier doch zur Exception führt, nicht unbedingt beim save()-Aufruf ausgeführt wird,
sondern erst verzögert, z.B. bei flush() + commit() auf die Session oder auch bei einer nächsten DB-Abfrage,

vielleicht kannst du mit flush() dafür sorgen, dass die BatchUpdateException innerhalb von lockCrud() auftritt
 

7bkahnt

Aktives Mitglied
ich habe es mal probiert
CrudDAOImpl.java:
Java:
@Override
	public boolean lockCrud(Integer auswahlid,Integer userid) throws Exception,BatchUpdateException,SQLException
	{
		System.out.println("lockCrud()");
		
		Lock lock = new Lock();
		boolean checkeintrag=false;
		
		Calendar cal = Calendar.getInstance();
		DateFormat df = DateFormat.getDateTimeInstance();
		String zeit=df.format(cal.getTime());
		
		
			String statement = "select lock.id_sb from Lock lock where lock.id=?";
		    List list = (List) session.createQuery(statement).setInteger(0, auswahlid).list();
		
		 if(list.size()==0){
			lock.setId(auswahlid);
			lock.setZeit(zeit);
			lock.setId_sb(userid);
			session.flush();
			session.save(lock);	
			checkeintrag=true;
		}
		else{
			buser=(Integer) list.get(0);
			checkeintrag=false;
		}
		return checkeintrag;
	}


CrudAction.java:

Java:
public String edit()
	{
		Integer userid=(Integer)session.get("userObject");   
		HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);
		Integer auswahlid=Integer.parseInt(request.getParameter("id"));
		session.put("auswahlid", auswahlid);
		
		//gewählten DS holen
		crud = crudDAO.listCrudById(Long.parseLong(request.getParameter("id")));
		
		//DS sperren
		boolean checkeintrag=false;
		try {
			checkeintrag=lockDAO.lockCrud(Integer.parseInt(request.getParameter("id")),userid); 
		} catch (BatchUpdateException e) {
			System.out.println("FEHLER durch BatchUpdateException");
			return "Fehler";
			}
		catch (SQLException e) {
			System.out.println("Fehler durch SQLException");
                        return "Fehler";
		}
		catch (Exception e) {
			System.out.println("Feher durch Exception");
                        return "Fehler";
		}
		
		//wenn DS nicht gelockt
		if(checkeintrag==true){
			return SUCCESS;
		}
		else{
			return "noedit";
		}
	}

Dasselbe in Grün. Irgendwie wird durch die Methode lockCrud keine Exception ausgelöst. Warum versteh ich ehrlich gesagt nicht.
Ich hatte bisher mit Exceptions noch nicht soviel am Hut, aber es muss doch wenigstens eine Exception ausgelöst werden od nicht?

Das mit dem Status hab ich ja schon hinbekommen, wenn Nutzer A "bearbeiten" klickt und danach Nutzer B auf den selben DS, dann bekommt er angezeigt, dass er gerade bearbeitet wird.
Das Problem ist eben nur wenn beide gleichzeitig bearbeiten klicken, weil dann wollen beide
insert into lock(....)..... ausführen mit denselben DS-ID´s und die Spalte ist ja unique.
Somit bekomm ich unter anderem einen Fehler ORA-00001: Unique Constraint (SYSTEM.LOCK_T_UK2) verletzt, was ja klar ist.
Nur ich dachte ich kann sowas evtl abfangen, dass der Erste durchkommt und der Zweite dann einen Hinweis bekommt.
 
Zuletzt bearbeitet:
S

SlaterB

Gast
flush() == durchspülen, saubermachen, alles wegschreiben natürlich NACH dem save()

wenn es Transaktionen gibt und jeder für sich arbeitet bis committed wird,
dann kann es immer noch sein, dass die Exception erst sehr spät beim commit stattfindet,
 

7bkahnt

Aktives Mitglied
Stimmt klar. Super danke!
Jetzt schreibt er mir aus "Fehler durch Exception".
Jetzt gibt es nur noch ein Problem.
Eclipse geht bei mir immer nach dem gleichzeitigen klicken in den Debug Mode.
Somit muss ich immer solange step over klicken, bis er endlich den Fehler catched.
Gibt es da eine Möglichkeit das zu umgehen, dass er nicht in den Debug-Modus geht?
Sorry klingt ein wenig nach Anfängerfragen:D, aber hatte bisher nicht soviel mit Exceptions und Debuggen am Hut.

grüsse
 
S

SlaterB

Gast
wie startest du das Programm denn, Screenshot vom Menüeintrag/ Button den du wählst,
selber links, rechts, oben, unten davon nach normalen Run suchen,

evtl. hast du kleine grüne Kreise, Breakpoints am linken Rand im Java-Editor einer Klasse, die kann man auch wieder entfernen
 

7bkahnt

Aktives Mitglied
Nee ich hatte keine Breakpoints gesetzt. Bin immer in der MyEclipse Java Enterprise-Umgebung
Ich hab das Projekt einfach nochmal komplett rausgehauen, MyEclipse neugestartet und wieder importiert.
Jetzt funktioniert es wunderbar.
Die Exception wird sofort ausgeschrieben und der zweite Nutzer bekommt sofort den Hinweis, dass der DS bearbeitet wird.
Danke euch für die super Hilfe!:)

grüsse
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Z Exception wird nicht ausgelöst Allgemeine Java-Themen 2
B Exception wird geworfen, ich darf sie aber nicht abfangen. Allgemeine Java-Themen 10
C FileLock - Exception wird immer geworfen Allgemeine Java-Themen 4
M Try-Catch: wie wird Variable bei Exception initialisiert? Allgemeine Java-Themen 8
A Exception in Konstruktor - trotzdem wird Objekt erzeugt! Allgemeine Java-Themen 3
H Object cast exception Allgemeine Java-Themen 7
W Queue.remove() -> no such element exception Allgemeine Java-Themen 17
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
N Kann ich die Nullpointer Exception umgehen Allgemeine Java-Themen 12
N A java Exception has occured Allgemeine Java-Themen 8
G javafx "class path" exception Allgemeine Java-Themen 5
H Interface PluginSystem ClassNotFound exception für library Klassen Allgemeine Java-Themen 10
tom.j85 Exception bei Abfrage von Ländercodes in API? Allgemeine Java-Themen 13
S Exception Allgemeine Java-Themen 5
LimDul Streams und Exception Allgemeine Java-Themen 8
S Wertbeschränkung Exception oder Anpassung? Allgemeine Java-Themen 4
D Nullpointer Exception Problem Allgemeine Java-Themen 5
Kirby.exe Nullpointer Exception bei Queue Allgemeine Java-Themen 5
R Schlüsselworte "Throw new exception" gibt nicht den String als Fehlermeldung aus Allgemeine Java-Themen 2
P Swing Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: npoints > xpoints.length || npoints > ypoints.length Allgemeine Java-Themen 5
S RMI Exception Allgemeine Java-Themen 0
S MSSQL Exception & Connection String Allgemeine Java-Themen 19
S Interface, generischer Datentyp, Exception? Allgemeine Java-Themen 3
coolian warum bekomme ich ein string index out of bounds exception Allgemeine Java-Themen 17
B Aufruf der Methode ergibt eine Exception Allgemeine Java-Themen 13
S Exception in thread "main" java.lang.NullPointerException at FamilienApp.main(FamilienApp.java:15) Allgemeine Java-Themen 1
M Klassen Serializable Exception Allgemeine Java-Themen 1
E HILFE !! Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/io/FileUtils Allgemeine Java-Themen 4
E Thread Exception Allgemeine Java-Themen 6
javaerd Binomialkoeffizient ausrechnen, Exception in thread "main" java.lang.StackOverflowError Allgemeine Java-Themen 6
M xlsx File auslesen Exception occured Allgemeine Java-Themen 13
X jvm exception abfangen und an externes Programm schicken Allgemeine Java-Themen 4
G Java/LibGDX File Loading Exception Allgemeine Java-Themen 2
B Exception in Application init method Allgemeine Java-Themen 5
H OOP Testen einer Exception mit JUnit Allgemeine Java-Themen 8
M javafx ComboBox- Nullpointer Exception Allgemeine Java-Themen 6
perlenfischer1984 Dialect class not found exception Allgemeine Java-Themen 15
Thallius Bekomme keine Exception mit Stacktrace mehr. Was habe ich getan? Allgemeine Java-Themen 13
perlenfischer1984 Functionsparameter prüfen und eine Exception werfen !? Allgemeine Java-Themen 11
E Probleme mit nextInt() und Exception Allgemeine Java-Themen 35
0 Animiertes Gif anzeigen - NullPointer Exception Allgemeine Java-Themen 19
T Konstruktor löst exception aus Allgemeine Java-Themen 7
KilledByCheese Dezimal nach Hexadezimal rechner wirft seltsame exception Allgemeine Java-Themen 4
V Compiler-Fehler Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 125, Size: 125 Allgemeine Java-Themen 11
D Codeausführung bevor Exception abgeschlossen ist Allgemeine Java-Themen 11
T FileNotFound Exception Allgemeine Java-Themen 9
L Exception/Error auf JDialog umleiten Allgemeine Java-Themen 2
C Arithmetic Exception, obwohl nichts 0 ist Allgemeine Java-Themen 5
M A Java Exception has occured. Allgemeine Java-Themen 1
J Exception in thread "main" java.lang.NoClassDefFoundError Allgemeine Java-Themen 4
M Exception in thread "AWT-EventQueue-0" Allgemeine Java-Themen 6
P Input/Output java.util.Scanner in einer Schleife und Exception-Behandlung: Einlesen einer Zahl Allgemeine Java-Themen 4
E A Java Exception Has Occured Allgemeine Java-Themen 4
T Exception handling Allgemeine Java-Themen 7
P lazy loading exception Allgemeine Java-Themen 0
A Interpreter-Fehler OutOfMemory Exception mit Base64 decode Allgemeine Java-Themen 3
S Java Applet Crash - Keine Exception Allgemeine Java-Themen 8
S Best Practice verschiedene Exceptions fangen und neue Exception erzeugen Allgemeine Java-Themen 11
K Exception in thread "AWT-EventQueue-1" Allgemeine Java-Themen 2
K Gepacktes Jar-File gibt beim Doppelklick eine Exception aus Allgemeine Java-Themen 4
P Eigene Exception Klasse Allgemeine Java-Themen 7
N Java Interne Exception Allgemeine Java-Themen 4
B JUnit4 Exception-Test Allgemeine Java-Themen 4
127.0.0.1 SQL Exception, kein Driver Allgemeine Java-Themen 9
S Erste Schritte Exception beendet Schleife nicht - Methode macht trotz throw weiter? Allgemeine Java-Themen 9
R ZIP FileSystem unter Windows wirft exception Allgemeine Java-Themen 7
H java.util.Timer und Funktion mit SQL Exception Allgemeine Java-Themen 5
Ollek Barcode mit Barcode4J erzeugen - Exception Allgemeine Java-Themen 4
Z Concurrent Modification Exception - HashMap (kein remove) Allgemeine Java-Themen 4
E Eigene Exception Klasse erstellen Allgemeine Java-Themen 3
L Variablen IO Exception weil File angeblich nicht exisitert Allgemeine Java-Themen 10
T Exception versus Rückgabeparamter Allgemeine Java-Themen 26
S Exception enableDepthTest Allgemeine Java-Themen 7
M JAXB Reimport zu Hibernate DB -> Exception Allgemeine Java-Themen 3
W Kleine Frage zu Null-Pinter-Exception Allgemeine Java-Themen 21
aze JUnit: Testen ob bestimmte Exception nicht auftritt Allgemeine Java-Themen 18
S Null Pointer Exception bei BufferedReader Allgemeine Java-Themen 4
N Runtime.exec() Exception Problem Allgemeine Java-Themen 3
P Default constructor cannot handle exception type Allgemeine Java-Themen 6
M Objekt prüfen auf null ->Invocation Target Exception??? Allgemeine Java-Themen 2
S Bildaufbau durch Servlet -> Exception Allgemeine Java-Themen 11
E Queue: Wie kann hier ein null-Pointer Exception auftreten?! Allgemeine Java-Themen 11
S Exception beim Schreiben des Dataset in XML Datei Allgemeine Java-Themen 8
M Webstart Exception trotz signierten JARs Allgemeine Java-Themen 3
E Interpreter-Fehler unbekannte Exception Allgemeine Java-Themen 12
B Komische Exception Allgemeine Java-Themen 4
U SwingWorker und Exception Allgemeine Java-Themen 3
B Nullpointer Exception in Array Allgemeine Java-Themen 15
G WebService Exception Allgemeine Java-Themen 3
M Best Practices Exception Handling für eigene library Allgemeine Java-Themen 8
G PermSpace Exception Allgemeine Java-Themen 2
S Invalid Chunk Exception Allgemeine Java-Themen 3
N URLClassLoader Exception Allgemeine Java-Themen 5
Apo Java Sound Mark/Reset Exception Allgemeine Java-Themen 14
M Exception ganz sehen Allgemeine Java-Themen 2
D Problem mit EasyMock und Exception Allgemeine Java-Themen 6
C Desktop.mail Problem. IO Exception: Failed to open. Allgemeine Java-Themen 3
L [Exception] RSA Verschlüsselung. Allgemeine Java-Themen 16
Final_Striker Exception bei neuem Look und Feel Allgemeine Java-Themen 2
N Exception beim auslesen einer JTable Allgemeine Java-Themen 5

Ähnliche Java Themen


Oben