[Java] JDK NoClassDefFoundError

Pagina: 1
Acties:

Onderwerpen

Vraag


  • uppie8374
  • Registratie: Maart 2002
  • Laatst online: 23-05 18:18
Mijn vraag:

Ik ben begonnen om Java te leren zonder IDE, maar met Notepad en JDK via de Command Prompt. Dit werd mij geadviseerd omdat je uiteindelijk beter begrip krijgt van het geheel. Van een stuk online training kreeg ik 2 bestanden, te weten W1d1.java en Tijdstip.java en er stond als uitleg dat ik de JDK moest installeren en deze twee bestanden maar eens uit moest proberen. Meer niet. In eerste instantie kreeg ik de twee bestanden al niet gecompiled omdat in W1d1 een object/instantie Tijdstip werd gemaakt. Als tip kreeg ik om "javac W1d1.java Tijdstip.java" als commando uit te voeren. Dit werkte voor het compilen. Wanneer ik nu echter W1d1 wil runnen krijg ik de volgende melding

"Error: Could not find or load main class W1d1
Caused by: java.lang.NoClassDefFoudError: w1d1/W1d1 (wrong name: W1d1)"

Ik heb deze melding wel al opgezocht met Google, maar hier geen oplossing voor gevonden.


Relevante software en hardware die ik gebruik

JDK 10.0.2

Wat ik al gevonden of geprobeerd heb

Om het geheel uberhaupt werkend te krijgen heb ik al gevonden dat ik bij de omgevingsvariabelen de variabele PATH naar mijn JDK directory moet laten wijzen.

Rebuilding knowledge database

Beste antwoord (via uppie8374 op 12-09-2018 14:05)


  • SPee
  • Registratie: Oktober 2001
  • Nu online
Je hebt in je code staan
Java:
1
package w1d1;

Dat betekent dat de betreffende classe/bestand in die directory moet staan.

Dus het moet er zo uit zien
D:\java\w1d1\W1d1.java
D:\java\w1d1\Tijdstip.java


Compileren en draaien zou dus moeten gaan via:
code:
1
2
D:\java> javac w1d1\W1d1.java w1d1\Tijdstip.java
D:\java> java -cp . w1d1.W1d1


Er is wel iets voor te zeggen om het op de moeilijke manier te leren. Echter, dan raad ik je wel aan om een boek te gebruiken die dit jou uitlegt.

let the past be the past.

Alle reacties


  • Giesber
  • Registratie: Juni 2005
  • Laatst online: 27-06 10:18
Je installatie (de path variabelen etc.) lijkt in orde te zijn, want het is Java zelf dat de fout geeft. Moest er iets aan de installatie mis zijn zou je vanuit het besturingssysteem een fout gekreven hebben in de trand van "java.exe niet gevonden.

Het ligt dus aan je code, of aan de manier waarop je de code oproept. Wat de fout zegt is dat hij de main class "W1" niet kan vinden. En die class gaat hij zoeken in de "w1" package. Die package vertaalt zich op de harde schijf naar een folder. En vergeet het classpath niet, daarin staat waar Java naar classes moet gaan zoeken. Dat kan je instellen als omgevingsvariabele, of meegeven aan je commando om uit te voeren (de optie -cp als ik het mij goed herinner).

Wat een beetje raar is, is dat er naar een class "W1" wordt gezicht, maar dat je een bestand "W1d1.java" hebt. Het is een best practice om klassenamen hetzelfde te nemen dan bestandsnamen (W1d1.java heeft dan een W1d1 class, en de class W1 hoort in W1.java te zitten). Voor public classes is dat zelfs verplicht (dat moest ik even opzoeken, ik doe het al zo lang dat ik niet meer wist of het een aanbeveling of verplichting is).

Probeer dus eens uit te zoeken of je ergens een W1 class hebt, en of Java die kan vinden (juiste folder -> denk aan de package, bestandsnaam, classpath). Of probeer uit te zoeken waarom Java naar een W1 class zoekt, en niet naar een W1d1 class.

  • uppie8374
  • Registratie: Maart 2002
  • Laatst online: 23-05 18:18
Excuus, ik heb de foutmelding aangepast. Hij gaf overal wel degelijk W1d1 aan, maar ik had nog niet genoeg koffie op 8)7

Ik heb even het W1d1.java bestand bekeken, en dat begint als volgt:

Java:
1
2
3
4
5
6
7
8
package w1d1;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
   
public class W1d1 extends JFrame {
  public static void main( String args[] ) {


Dus er staat een main in met de juiste classnaam W1d1 (voor zover ik het begrijp).

Overigens staan de 2 bestanden in mijn map D:\Java en roep ik in de command prompt het bestand als volgt aan: D:\Java\java W1d1

[ Voor 12% gewijzigd door uppie8374 op 12-09-2018 11:58 ]

Rebuilding knowledge database


  • Standeman
  • Registratie: November 2000
  • Laatst online: 14:25

Standeman

Prutser 1e klasse

De package geeft aan dat de class file in de folder w1d1 moet staan.

Je kan het dan runnen door:

code:
1
D:\java>java w1d1.W1d1

The ships hung in the sky in much the same way that bricks don’t.


  • uppie8374
  • Registratie: Maart 2002
  • Laatst online: 23-05 18:18
Standeman schreef op woensdag 12 september 2018 @ 12:18:
De package geeft aan dat de class file in de folder w1d1 moet staan.

Je kan het dan runnen door:

code:
1
D:\java>java w1d1.W1d1
Heb ik geprobeerd, maar geeft dezelfde foutmelding.
Tevens geprobeerd om het geheel in D:\java\w1d1 te zetten en dan te laten draaien, maar ook dezelfde foutmelding.

[ Voor 15% gewijzigd door uppie8374 op 12-09-2018 12:43 ]

Rebuilding knowledge database


  • Hydra
  • Registratie: September 2000
  • Laatst online: 13:27
uppie8374 schreef op woensdag 12 september 2018 @ 12:40:
Tevens geprobeerd om het geheel in D:\java\w1d1 te zetten en dan te laten draaien, maar ook dezelfde foutmelding.
Ten eerste; gebruik alsjebloeft gewoon een IDE die dit voor je regelt. Ik ben zelf een Java dev en van mening dat notepad gebruiken zo iets is als opzettelijk alleen je linkerhand gebruiken om te typen.

Wat er hier misgaat is dat je je code (met javac) moet compilen vanuit de directory waarin de w1d1 package staat. Daarna run je 'em ook vanuit die directory. java.exe gaat 'em niet vinden omdat je 'em nog niet met javac.exe gecompileerd hebt.

Post anders je hele project (dus alle java files) via https://gist.github.com/, dan kunnen we het zelf ook proberen te compilen.

https://niels.nu


  • Stoelpoot
  • Registratie: September 2012
  • Niet online
Hydra schreef op woensdag 12 september 2018 @ 12:46:
[...]


Ten eerste; gebruik alsjebloeft gewoon een IDE die dit voor je regelt. Ik ben zelf een Java dev en van mening dat notepad gebruiken zo iets is als opzettelijk alleen je linkerhand gebruiken om te typen.
Als beginner zou ik dit ook doen ja. Zelf kunnen compileren is erg leuk en nuttig, maar vaak is het op dat moment fijner om de taal in zo verre te begrijpen dat je een goed beeld hebt van hoe je input er uit ziet en hoe je output er uit moet zien.

Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • SPee
  • Registratie: Oktober 2001
  • Nu online
Je hebt in je code staan
Java:
1
package w1d1;

Dat betekent dat de betreffende classe/bestand in die directory moet staan.

Dus het moet er zo uit zien
D:\java\w1d1\W1d1.java
D:\java\w1d1\Tijdstip.java


Compileren en draaien zou dus moeten gaan via:
code:
1
2
D:\java> javac w1d1\W1d1.java w1d1\Tijdstip.java
D:\java> java -cp . w1d1.W1d1


Er is wel iets voor te zeggen om het op de moeilijke manier te leren. Echter, dan raad ik je wel aan om een boek te gebruiken die dit jou uitlegt.

let the past be the past.


  • uppie8374
  • Registratie: Maart 2002
  • Laatst online: 23-05 18:18
Bedankt, dit werkte voor mij!!!! Ik heb ook wel een boek, daar moet ik nog aan beginnen. Maar ook daar staat niet meer in dan dat je "javac" gebruikt op het .java bestand om de boel te compilen en daarna met "java" het .class bestand aanroept (zonder extensie).

Ja ik ben iemand die niet van shortcuts houdt, dus neem meestal de moeilijke weg 8)7

Rebuilding knowledge database


Acties:
  • +1 Henk 'm!

  • acemoo
  • Registratie: Maart 2006
  • Laatst online: 11:50
Het boek niet lezen is best een flinke shortcut.
Pagina: 1