Zum Inhalt springen

Laufzeitfehler und kein Debugger


byte

Empfohlene Beiträge

Hallo,

Hier mein kleines/grosses Problem. Ich habe ein Programm geschrieben in der eine Methode existiert die eine Datei, nach Übergabe des Dateinamen und des Schlüssels(ebenfalls in einer Datei gespeichert) entschlüsseln soll. Das ganze passiert nach einem sehr einfachem Substitutionsverfahren. Nun bin ich bei der Entwicklung allerdings auf einen Editor beschränkt und kann nicht vernünftig debuggen. Vielleicht wisst ihr ja einen Rat oder könntet es mal durchgehen.


public void decryptCaesar(String key, String out)
{
try
{
RandomAccessFile raf = new RandomAccessFile(key, "r");
byte[] temp = new byte[(int)raf.length()];
raf.readFully(temp);
int k = Integer.parseInt(temp.toString());
k = 255 -k;
for(int i=0; i < data.length; i++)
data[i] = (byte)(((int)data[i] - k) %255);
raf = new RandomAccessFile(out, "rw");
raf.write(data);
}
catch(Exception e)
{
System.err.println("decryptCaesar(): " + e.toString());
}
}
[/PHP]

Die Fehlermeldung zur Laufzeit lautet:

decryptCaesar(): java.lang.NumberFormatException: For input string: "[b@18d107f"

Falls ich was vergessen habe einfach nochmal nachfragen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also... ich kann es hier leider auch nicht mal eben zum Laufen bringen, so dass ich nur mal ein paar Fragen oder Anmerkungen habe...

1. Was macht byte genau? (Dann brauch ich nicht nachgucken :D )

Hierbei wird ein Array von bytes mit der Länge der Input-Datei angelegt?!

2. Passt das auf jeden Fall? Sprich: Reicht int da aus oder solltest du nicht besser big decimal oder long oder sowas nehmen? Würde mir hier mal eine Ausgabe setzen, wie lang das wird?!

3. Wieso parst du das hier: (int)raf.length()

Liefert length() nicht immer int zurück?

3. NumberFormatException könnte passieren, wo du versuchst, temp.toString in einen Int zu parsen. Was steht denn in temp drin? Mach dir auch hier mal ne Ausgabe und guck nach, ob sich das denn parsen lässt...

4. Wo definierst du data? (Nur mal so am Rande? :D

5. Würde mir bei dieser zeile auch mal data, i, k und das Ergebnis von dem Modulo ausgeben lassen, damit du siehst, ob das uberhaupt geparst werden kann.

6. Bei der Errormeldung deiner Exception kannst du mit e.printStackTrace() oder so in der Art den kompletten "Weg" deiner Exception seit dem Auftreten anzeigen lassen. Damit würdest du genauer sehen, wo die herkommt...

Das wars mal fürs erste.

Sorry, wenn ich das hier nicht testen kann... Aber ich würde es erst mal mit den Ausgaben versuchen und gucken, ob die jeweiligen Sachen wirklich geparst werden können, weil NumberFormatException gerade hierbei einen Fehler vemuten lässt. Insbesondere, wenn du von String auf Integer parsen willst.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von roaxius

Also... ich kann es hier leider auch nicht mal eben zum Laufen bringen, so dass ich nur mal ein paar Fragen oder Anmerkungen habe...

1. Was macht byte genau? (Dann brauch ich nicht nachgucken :D )

Hierbei wird ein Array von bytes mit der Länge der Input-Datei angelegt?!

byte ist einfach nur ein Datentyp der durch seinen Namen beschrieben wird, ich brauche ihn, da ich damit besser die Algorithmen verwirklichen kann. In das Array schreibe ich als bytes die komplette Input-Datei, daher die länge.

2. Passt das auf jeden Fall? Sprich: Reicht int da aus oder solltest du nicht besser big decimal oder long oder sowas nehmen? Würde mir hier mal eine Ausgabe setzen, wie lang das wird?!

Darum kann ich mir später gedanken machen, die Datei die ich zum Testen benutze lastet die Ressourcen da nicht im geringsten aus aber danke für den Tip.

3. Wieso parst du das hier: (int)raf.length()

Liefert length() nicht immer int zurück?

Nein. raf.length() liefer einen float oder long ich bin mir nicht ganz sicher aber nötig war es auf jeden Fall.

3. NumberFormatException könnte passieren, wo du versuchst, temp.toString in einen Int zu parsen. Was steht denn in temp drin? Mach dir auch hier mal ne Ausgabe und guck nach, ob sich das denn parsen lässt...

In temp steht der Schlüssel den ich aus der Datei gezogen habe. Dieser ist auch nicht von besonderer grösse und muss da ich ihn als Zahl verwenden will(Es ist immer eine Zahl) zum Int geparst.

4. Wo definierst du data? (Nur mal so am Rande? :D

data ist eine Globale variable, entschuldigung habe ich vergessen zu erwähnen und es ist bei solch einem Programm auch nicht ganz ungefährlich.

5. Würde mir bei dieser zeile auch mal data, i, k und das Ergebnis von dem Modulo ausgeben lassen, damit du siehst, ob das uberhaupt geparst werden kann.

Werde ich nochmal überprüfen. Sollte imo aber auch ohne Probleme zu parsen sein, da ich das in vorigen Methoden eigentlich genauso gemacht habe.

6. Bei der Errormeldung deiner Exception kannst du mit e.printStackTrace() oder so in der Art den kompletten "Weg" deiner Exception seit dem Auftreten anzeigen lassen. Damit würdest du genauer sehen, wo die herkommt...

Habe ich bereits gemacht. Brachte allerdings nicht wirklich etwas.

Das wars mal fürs erste.

Sorry, wenn ich das hier nicht testen kann... Aber ich würde es erst mal mit den Ausgaben versuchen und gucken, ob die jeweiligen Sachen wirklich geparst werden können, weil NumberFormatException gerade hierbei einen Fehler vemuten lässt. Insbesondere, wenn du von String auf Integer parsen willst.

Danke das du dich mit dem Problem auseinandergesetzt hast. Vielleicht fällt dir ja nochwas ein. Ich könnte auch den SourceCode posten, da das Projekt ehh OpenSource ist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von byte

Danke das du dich mit dem Problem auseinandergesetzt hast.

Gut, das war jetzt zwar keine Antwort auf meine Fragen und hört sich eher danach an, dass ich vollkommenen Blödsinn geschrieben habe :D Aber egal... :D

Wenn du den gesamten Quelltext hier genauso postest wie du meine Antwort zitierst (nämlich komplett :rolleyes: ) dann bekommst du aber bestimmt Ärger von den Mods :D

Aber ernsthaft: Wenn die Ausgabe mit System.out.println(Variable) der jeweiligen Werte deiner Variablen nichts bringt, dann bräuchtest du wirklich einen Debugger. Aber vorhger würde ich erst mal so ausgeben?! Wo ist denn da das Problem?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nocheinmal lesen und und merken das ich im Zitat kommentiert habe ;). Quelltext bau ich zusammen und lad ihn hoch, dann kann ihn sich angucken wer will. Vielleicht wird dann auch noch einiges klarer, kann aber noch einen Moment dauern mach jetzt erstmal Mittag.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von java.sun.com

public final void readFully(byte[] B) throws IOException

Reads b.length bytes from this file into the byte array, starting at the current file pointer. This method reads repeatedly from the file until the requested number of bytes are read.

Gut, also nachdem ich mir die Klasse RandomAccessFile mit den Methoden readFully(byte[]) und length() mal angeguckt habe... :D :

1. Ok, du brauchst ein byte[] Array

2. length() liefert long zurück. Soweit so gut, aber ich denke du wirst wirklich int brauchen wegen der Indizierung des Arrays

3. readFully(byte[]) liest, so wie ich das verstanden habe, den gesamten Block der Länge deines byte-Arrays ein. Wieso meinst du dann, dass in temp der Schlüssel steht, den du aus der Datei gezogen hast? Versteh ich leider so nicht. Und wenn ich das richtig verstanden habe und der den gesamten byte[] Inhalt zieht, dann wäre es auch wirklich etwas schwierig, das in einen int zu parsen und du hättest hierbei das Problem.

Oder steh ich hier irgendwie auf dem Schlauch? :confused:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Habe ich grade ausprobiert, erzielt genau das selbe Ereigniss. Aufgefallen ist mir grade das es dabei eindeutig um den Schlüssel handelt. Ich denke ich habe das Problem gefunden.

Ich habe immer damit gerechnet das er eine Zahl in die Datei schreibt. Tut er aber nicht, er wandelt das irgendwie immer in ein ASCI-Zeichen um. Kann ich das irgendwie umgehen oder mir zu nutze machen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also ich sehe hier eigentlich auch wirklich den Fehler:

Du liest ein komplettes Byte-Array in die Variable temp ein und dann versuchst du das komplette Byte-Array (also temp) in einem Rutsch in einen String zu machen und dann in int zu parsen. Das kann doch nicht funktionieren, oder?

Edit: Ups, hab ich wohl etwas zu lange nicht mehr aktualisiert gehabt, bevor ich geantwortet habe. :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...