Exception in der metode
-
Hallo, ich bin es wieder. Aber ich habe noch ein Problem mit meinen Vectoren. Mein code sieht wie folgt aus:
public static void getVollSys(){ int a=0; int b=1; int c=2; int d=3; int e=4; int f=5; vVollSys.add(new Vector()); ((Vector)vVollSys.lastElement()).add(vZahl.get(a)); ((Vector)vVollSys.lastElement()).add(vZahl.get(b)); ((Vector)vVollSys.lastElement()).add(vZahl.get(c)); ((Vector)vVollSys.lastElement()).add(vZahl.get(d)); ((Vector)vVollSys.lastElement()).add(vZahl.get(e)); ((Vector)vVollSys.lastElement()).add(vZahl.get(f)); while(vZahl.get(a) != vZahl.get(vZahl.size()-6)){ if(Integer.parseInt((String)vZahl.get(f)) < Integer.parseInt((String)vZahl.get(vZahl.size()-1))) f=f+1; else { if(Integer.parseInt((String)vZahl.get(e)) < Integer.parseInt((String)vZahl.get(vZahl.size()-2))) { e=e+1; f=e+1; } else { if(Integer.parseInt((String)vZahl.get(d)) < Integer.parseInt((String)vZahl.get(vZahl.size()-3))) { d=d+1; e=d+1; f=e+1; } else { if(Integer.parseInt((String)vZahl.get(c)) < Integer.parseInt((String)vZahl.get(vZahl.size()-4))) { c=c+1; d=c+1; e=d+1; f=e+1; } else { if(Integer.parseInt((String)vZahl.get(b)) < Integer.parseInt((String)vZahl.get(vZahl.size()-5))) { b=b+1; c=b+1; d=c+1; e=d+1; f=e+1; } else { a=a+1; b=a+1; c=b+1; d=c+1; e=d+1; f=e+1; } } } } } vVollSys.add(new Vector()); ((Vector)vVollSys.lastElement()).add(vZahl.get(a)); ((Vector)vVollSys.lastElement()).add(vZahl.get(b)); ((Vector)vVollSys.lastElement()).add(vZahl.get(c)); ((Vector)vVollSys.lastElement()).add(vZahl.get(d)); ((Vector)vVollSys.lastElement()).add(vZahl.get(e)); ((Vector)vVollSys.lastElement()).add(vZahl.get(f)); } }
Das komische ist dass es erstmal läuft und nach einer bestimmten zeige ich einfach die fehlermeldung Exception found bekomme. wenn ich das debuge dann funktioniert dass. natürlich laufe ich das nicht ganz durch weil ich ein jahr dran sitzen würde. aber es sieht so aus als würde es funktionieren nur zum schluß klappt was nicht. schafft vieleicht java so eine menge nicht zu verarbeiten. in c++ habe ich das gleiche geschrieben und es läuft.
Noch nebenbei. Der Vector vZahl hat alle 49 zahlen gespeichert. Diese methode soll alle sechser kombinationen für alle 49 zahlen ausgeben. aber es geht nicht.
kann mir jemand vieleicht helfen
-
Hi
kanst du auch bitte die Fehlermeldung mit angeben, das kann ungemein helfen
Vorallem wenn man weis was die Laufzeitumgebung einem damit sagen will.
ggf in der main mal einen try catch reinbauen, um nen vernünftigen trace zu bekommen.try{ } catch(Exception e) { e.printStackTrace(); }
gruss
-
Wenn ich das in einen try/catch block setze dann bekomme ich gar nichts zurück. das programm wird normal beendet. ich bekomme aber auch kein ergebnis, wenn ich zum beispiel die größe des vectors abfrage.
Wenn ich jedoch den try/catch block rauslasse dann bekomme ich folgendes:
Exception in thread "main" java.lang.NullPointerException
at garantie.getVollSys(garantie.java:74)
at garantie.main(garantie.java:145)Kann mir vieleicht jemand helfen.
-
Hallo nochmal. Also ich habe das jetzt absolut überarbeitet und der code sieht wie folgt aus:
public class garantie { public static void main(String[] args) { Vector vZahl = new Vector(); Vector vVollSys = new Vector(); for(int i=1;i<50;i++){ vZahl.add(String.valueOf(i)); } try { int a=0; int b=1; int c=2; int d=3; int e=4; int f=5; vVollSys.add(new Vector()); ((Vector)vVollSys.lastElement()).add(vZahl.get(a)); ((Vector)vVollSys.lastElement()).add(vZahl.get(b)); ((Vector)vVollSys.lastElement()).add(vZahl.get(c)); ((Vector)vVollSys.lastElement()).add(vZahl.get(d)); ((Vector)vVollSys.lastElement()).add(vZahl.get(e)); ((Vector)vVollSys.lastElement()).add(vZahl.get(f)); while(vZahl.get(a) != vZahl.get(vZahl.size()-6)){ if(Integer.parseInt((String)vZahl.get(f)) < Integer.parseInt((String)vZahl.get(vZahl.size()-1))) f=f+1; else { if(Integer.parseInt((String)vZahl.get(e)) < Integer.parseInt((String)vZahl.get(vZahl.size()-2))) { e=e+1; f=e+1; } else { if(Integer.parseInt((String)vZahl.get(d)) < Integer.parseInt((String)vZahl.get(vZahl.size()-3))) { d=d+1; e=d+1; f=e+1; } else { if(Integer.parseInt((String)vZahl.get(c)) < Integer.parseInt((String)vZahl.get(vZahl.size()-4))) { c=c+1; d=c+1; e=d+1; f=e+1; } else { if(Integer.parseInt((String)vZahl.get(b)) < Integer.parseInt((String)vZahl.get(vZahl.size()-5))) { b=b+1; c=b+1; d=c+1; e=d+1; f=e+1; } else { a=a+1; b=a+1; c=b+1; d=c+1; e=d+1; f=e+1; } } } } } vVollSys.add(new Vector()); ((Vector)vVollSys.lastElement()).add(vZahl.get(a)); ((Vector)vVollSys.lastElement()).add(vZahl.get(b)); ((Vector)vVollSys.lastElement()).add(vZahl.get(c)); ((Vector)vVollSys.lastElement()).add(vZahl.get(d)); ((Vector)vVollSys.lastElement()).add(vZahl.get(e)); ((Vector)vVollSys.lastElement()).add(vZahl.get(f)); } } catch(Exception e){ e.fillInStackTrace(); } System.out.println(String.valueOf(vVollSys.size())); } }
Ich habe es auch schon versucht mit: vVollSys.setSize(14000000);
Doch leider geht es nicht. ich bekomme diesmal folgendes:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap spaceSoll das heißen dass Java so eine menge nicht schafft. Ich habe das gleiche in C++ geschrieben und es läuft einwandfrei. Wieso will es denn nicht in java laufen. Bin echt ratlos. Kann mir vieleicht jemand sagen woran es liegen kann.
-
Während sich native so viel schnappen können wie da ist bestimmt bei Java die VM das Maximum des Heaps.
Laut http://developer.apple.com/documentation/Java/Reference/Java14VMOptions/VM_Options/chapter_1_section_4.html ist 64 MB der Standard-Wert.
Mit java -Xmx<size> ** kanst Du den Heap manuell festlegen.
Oder probier's mit dem -server flag für 128 MB.
-
Ich habe schon folgendes gemacht:
java -Xmx500m -Xms500Mes hat nichts gebracht. Woran kann es liegen. Ist java für sowas absolut das falsche.
-
mal rechnen...
du hast 14000000 Vectoren mit jeweils 10 Elementen. Dafür brauchst du mindestens folgenden Speicherplatz:
14000000 * (4+8+4+8+10*4) = 14000000 * 64 = 896.000.000 Byte.
...und da stehen noch keine Zahlen in den Vectoren drin, du brauchst also noch deutlich mehr.
Mit anderen Worten: Du gehst einfach viel zu verschwenderisch mit dem Speicherplatz um. Da geschieht dir ein OutOfMemoryError ganz recht.
-
Sei doch nicht so gemein zu ihm.
-
Optimizer schrieb:
Sei doch nicht so gemein zu ihm.
Meinste, das war zu deutlich gesagt? ...dann gibt es als Wiedergutmachung eine kleine Notlösung, um den Speicherverbrauch zu mindern:
Statt den 14000000 Vectoren nimmst du einfach 14000000 byte-Arrays der Länge 6. Dann benötigst du noch ungefähr folgenden Speicherplatz (in der obigen Rechnung habe ich übrigens eine 4 zu wenig):
14000000 * (4+8+4+6*1) = 308.000.000 Byte.
Dann sollte dein -Xmx500m eigentlich klappen. ...naja, vielleicht auch nicht, probier es einfach aus.
-
Hallo, ich kann euch nur eins sagen was ich schon öfters gesagt habe. ich habe das ganze in c++ implementiert und es läuft einwandfrei. ohne jeglichen mist von xmx500. Das kann doch nicht wahr sein dass java mit sowas nicht klar kommt. wofür soll dann das gut sein. um das kleine 1x1 zu berechnen. dafür brauche ich keine computer und schon gar nicht eine programmiersprache wie java.
in c++ deklariere ich folgendes:struct zahl{ int zahl1; int zahl2; int zahl3; }; std::vector<zahl> vVollSys;
Somit kann ich meinen Vector so zuknalle wie es nur geht. Ganz nebenbei gesagt berechne ich all 13... milionen kombinationen in c++ in ein paar sekunden.
Da ich aber das ganze in java brauche wollte ich dafür eine lösung haben aber es geht leider nicht. So wie es aussieht kann man sowas nicht mit java lösen. Ich bin schon von der Gui und dem tempo von java echt enttäuscht aber jetzt noch das.
Kann es vieleicht sein, dass ich das ganze anders programmieren sollte?
-
Gregor schrieb:
14000000 * (4+8+4+8+10*4) = 14000000 * 64 = 896.000.000 Byte.
Auch wenn ich die Rechnung nicht verstehe, das sind ja 850 MB!!
Da müßte unser Kollege also min. 1 GB RAM sein eigen nennen!
Wieviel Platz nimmt denn Dein C++ Prog ein?! Mal im TaskMan geschaut?!
EDIT: Vielleicht postest Du zum Vergleich mal Deinen C++ Code?
-
Hi, hier ist mein c++ code:
header:struct zahl{ int z1; int z2; int z3; int z4; int z5; int z6; };
cpp:
#include ".\garantie.h" #include <stdio.h> #include <vector> void main(){ printf("Beginne mit Rechnen\n"); using namespace std; std::vector<zahl> vVollSys; std::vector<int> vZahl; vVollSys.reserve(14000000); for(int i=1;i<50;i++){ vZahl.push_back(i); } int a=0; int b=1; int c=2; int d=3; int e=4; int f=5; zahl z; z.z1 = vZahl[a]; z.z2 = vZahl[b]; z.z3 = vZahl[c]; z.z4 = vZahl[d]; z.z5 = vZahl[e]; z.z6 = vZahl[f]; vVollSys.push_back(z); while(vZahl[a] != vZahl[vZahl.size()-6]){ if(vZahl[f]<vZahl[vZahl.size()-1]) f=f+1; else { if(vZahl[e]<vZahl[vZahl.size()-2]) { e=e+1; f=e+1; } else { if(vZahl[d]<vZahl[vZahl.size()-3]) { d=d+1; e=d+1; f=e+1; } else { if(vZahl[c]<vZahl[vZahl.size()-4]) { c=c+1; d=c+1; e=d+1; f=e+1; } else { if(vZahl[b]<vZahl[vZahl.size()-5]) { b=b+1; c=b+1; d=c+1; e=d+1; f=e+1; } else { a=a+1; b=a+1; c=b+1; d=c+1; e=d+1; f=e+1; } } } } } z.z1 = vZahl[a]; z.z2 = vZahl[b]; z.z3 = vZahl[c]; z.z4 = vZahl[d]; z.z5 = vZahl[e]; z.z6 = vZahl[f]; vVollSys.push_back(z); } printf("Rechnen Fertig\n"); printf("Das Ergebnis lautet: %d",vVollSys.size()); getchar();
So, wenn ich das starte habe ich in ein paar sekunden das ergebnis. Was habe ich denn nur in java falsch gemacht, dass es nicht gehen will. Ist wirklich java für sowas die falsche programmiersprache ?
-
Und noch ganz nebenbei. Mein Taskmanager zeigt mit eine Speicherauslastung von 329.508K
-
In C++ bist du geringfügig besser an die Sache herangegangen. Da hast du keinen Vektor von Vektoren, die alle viel zu lang sind, genommen, sondern du hast einen Vektor, in dem deine "zahl"-structs abgespeichert sind. Das ist zwar auch nicht gerade eine optimale Lösung (Warum sind da zum Beispiel lauter ints im struct? Das ist totale Platzverschwendung.), aber eine bessere, als mit den Vektoren.
Hättest du in Java etwas äquivalentes gemacht, nämlich statt dem struct eine Klasse geschrieben, die in etwa so aussieht:
public class Zahl { public int z1; public int z2; public int z3; public int z4; public int z5; public int z6; }
...dann würde der Speicherverbrauch bei etwa
14000000 * (4+8+6*4) = 504.000.000 Byte liegen. Der Speicherverbrauch käme deinen 329MB von der C++-Version also schon näher. Wenn du dir Gedanken bezüglich des Speicherverbrauchs machen würdest, dann könntest du nochmal ein ganzes Stück Speicherplatz einsparen, habe ich dir ja weiter oben in einer Rechnung demonstriert.
Du wirst in Java aber normalerweise etwas mehr Speicherverbrauch als in C++ haben, das bringt das Prinzip der Sprache mit sich. Dafür bekommst du Sprachmittel, wie Reflection, die du so in C++ erstmal nicht hast.
-
Sgt. Nukem schrieb:
Gregor schrieb:
14000000 * (4+8+4+8+10*4) = 14000000 * 64 = 896.000.000 Byte.
Auch wenn ich die Rechnung nicht verstehe, das sind ja 850 MB!!
Ich gebe mal an, was was bei der Rechnung ist:
14000000 - Elemente hat das interne Array des äußeren Vektors.
4 - 4 Byte werden jeweils für die Referenz auf einen inneren Vektor benötigt.
8 - 8 Byte (in denen Informationen über die Klasse gespeichert werden) bringt in Java jedes Objekt als Overhead mit. Dies ist der Overhead der inneren Vektoren.
4 - Jeder innere Vektor hat intern ein Array. Dies ist die Referenz auf das Array.
8 - Dies ist der Objekt-Overhead des internen Arrays jedes inneren Vektors.
(vergessen: 4 - 4 Byte werden für die Speicherung der Länge jedes internen Arrays benötigt.)
10*4 - Das Array jedes inneren Vektors hat 10 Elemente, die jeweils Referenzen enthalten, also jeweils 4 Byte groß sind.Das war's... alles klar jetzt?
-
JavaNewbie schrieb:
Kann es vieleicht sein, dass ich das ganze anders programmieren sollte?
Gut möglich. Das kommt drauf an, was das Programm eigentlich leisten soll. Gib mal die Aufgabenstellung an.
-
Hallo an alle, erstmal vielen dank dass ihr mir versucht zu helfen.
Mein problem ist einfach folgendes. ich will von 49 zahlen alle möglichen 6er kombinationen haben. also: 1,2,3,4,5,6 dann 1,2,3,4,5,7 und so weiter. dann sind bei 49 zahlen fast 14000000 kombinationen. Jetzt brauche ich halt eine lösung um diese zu berechnen und irgendwo abzulegen. Ein Array oder sonst etwas. Jedoch muß es variabel sein da ich vieleicht morgen schon nur 30 zahlen testen will. Das ergebnis will ich dann ausdrucken oder analysieren. mehr nicht. Gibt es da eine schönere lösung als meine?@Gregor
Das ich das in c++ besser gelöst habe, liegt daran dass ich c++ ein bißchen besser kann als Java. In java kannte ich nur so eine lösung für einen mehrdimensionalen Vektor. Du sagst aber dass man dass noch besser lösen könnte. Ich wäre echt neugierig wie man dass noch besser machen kann. Kannst du mir einen Tip geben?
-
JavaNewbie schrieb:
sind [...] fast 14000000 kombinationen.
[...]
Das ergebnis will ich dann ausdruckenIch hoffe Du hast schonmal bei einer Zeitungsdruckerei eine dieser 2-Tonnen-Papier-Rollen bestellt...
-
Schriftgröße 1
-
Hallo,
wie schön dass ihr auf so ein blödsinn immer eine antwort habt. Alles will ich nicht ausdrucken. Ich wollte es nur deshalb hinschreiben damit später nicht dummer antworten kommen wieso ich dass nicht direkt in eine datei ablege. Ich brauche es im speicher damit ich damit arbeiten kann. Mein problem ist nicht das papier sondern dass ich es zum laufen bekomme.