Permalänk
Medlem

Vad är fel med Javakoden?

Hej! Försöker göra en enkel klass med InteliJ
.

import java.awt.print.Book; public class Main { public static void main(String[] args) { //TIP Press <shortcut actionId="ShowIntentionActions"/> with your caret at the highlighted text // to see how IntelliJ IDEA suggests fixing it. System.out.print("Hello and welcome!"); Book test = new Book(); test.setTitle("Java for Dummies"); System.out.print(test.getTitle()); } }

public class Book { private String title; //Variabel som endast kan nås i klassen. private String author; private int price; //egenskaper (properties). Används för att förhindra åtkomst till privata variabler. //Getter for "title" public String getTitle() { return title; } // Setter for "title" public void setTitle(String title) { this.title = title; } //Getter for "author" public String Author() { return author; } // Setter for "author" public void setAuthor(String author) { this.author = author; } //Getter for "price" public int Price() { return price; } // Setter for "price" public void setPrice(int price) { this.price = price; } }

Att skapa objektet går bra men när jag ska använda getter och setter får jag detta:

C:\Java\konstruktorTest\src\Main.java:13:13
java: cannot find symbol
symbol: method setTitle(java.lang.String)
location: variable test of type java.awt.print.Book

Visa signatur

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Skärm:Samsung Odyssey G9 || Windows 10

Permalänk
Medlem

Din namngivelse krockar med java.awt.print.. båda heter book, testa byt namn på din klass så ska du se att det kommer fungera.

public class Main {
public static void main(String[] args) {
System.out.print("Hello and welcome!");

MyBook test = new MyBook();

test.setTitle("Java for Dummies");

System.out.print(test.getTitle());
}
}

public class MyBook {
private String title;
private String author;
private int price;

// Getter for "title"
public String getTitle() {
return title;
}

// Setter for "title"
public void setTitle(String title) {
this.title = title;
}

// Getter for "author"
public String getAuthor() {
return author;
}

// Setter for "author"
public void setAuthor(String author) {
this.author = author;
}

// Getter for "price"
public int getPrice() {
return price;
}

// Setter for "price"
public void setPrice(int price) {
this.price = price;
}
}

Permalänk

Din import av klassen Book är fel.
Du importerar:
https://docs.oracle.com/javase/7/docs/api/java/awt/print/Book...

... Inte den klass som du har skapat. Radera import-raden och låt Intellij-fixa den på nytt. Troligtvis får du välja vilken import du vill ha.

Permalänk
Medlem
Skrivet av Huttifnutt:

Din import av klassen Book är fel.
Du importerar:
https://docs.oracle.com/javase/7/docs/api/java/awt/print/Book...

... Inte den klass som du har skapat. Radera import-raden och låt Intellij-fixa den på nytt. Troligtvis får du välja vilken import du vill ha.

Sen är det väl inte direkt best practice att döpa saker likadant som i andra bibliotek. Rekommenderar honom att ändra namn, men rekommenderar även att han förstår vad du menar med paketen. Det kommer bli viktigt framöver att man förstår vad det är för paket man använder i koden.

Permalänk
Medlem

Ok, tack! Den raden lades till automatiskt.

import java.awt.print.Book;

Fick något att klassen låg fel. Nu fungerar det även utan import. För att de är i samma paket antar jag?

Visa signatur

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Skärm:Samsung Odyssey G9 || Windows 10

Permalänk
Skrivet av Maddoxswe:

Sen är det väl inte direkt best practice att döpa saker likadant som i andra bibliotek. Rekommenderar honom att ändra namn, men rekommenderar även att han förstår vad du menar med paketen. Det kommer bli viktigt framöver att man förstår vad det är för paket man använder i koden.

Absolut, åtminstone stoppa in det i ett package. Men för triviala småprojekt vill man nog bara få bort felet så att man kan fortsätta

Permalänk
Medlem
Skrivet av Huttifnutt:

Absolut, åtminstone stoppa in det i ett package. Men för triviala småprojekt vill man nog bara få bort felet så att man kan fortsätta

Så Book är något inbyggt?

Visa signatur

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Skärm:Samsung Odyssey G9 || Windows 10

Permalänk
Medlem
Skrivet av Larsp777:

Så Book är något inbyggt?

Book är en klass i AWT, ett av Javas GUI-bibliotek. Problemet var att du importerade den klassen, vilket då kolliderade med din egen Book-klass.

Men så länge som du inte importerar den klassen rakt in i namnrymden dina klasser ligger i så är det inget problem om din klass också heter Book, hela poängen med paket i Java är trots allt att undvika namnkollisioner.

Permalänk
Medlem
Skrivet av Larsp777:

Så Book är något inbyggt?

java.awt.print.Book är något inbyggt. Om du importerar den (vilket du gjorde i din ursprungliga kod) så kommer Book syfta på java.awt.print.Book (det är hela poängen med en import, att slippa skriva ut fully qualified name till saker) istället för den Book du själv definierat. Inget problem i sig att din klass heter Book, bara att du behöver ha koll på dina imports så att du inte får in fel Book.

Visa signatur

Spela Swemantle! Du vet att du vill.

Ibland har jag fel, men då är det någon annans fel.

Permalänk
Medlem
Skrivet av LemonIllusion:

java.awt.print.Book är något inbyggt. Om du importerar den (vilket du gjorde i din ursprungliga kod) så kommer Book syfta på java.awt.print.Book (det är hela poängen med en import, att slippa skriva ut fully qualified name till saker) istället för den Book du själv definierat.

Ok, den lades till automatiskt.

Visa signatur

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Skärm:Samsung Odyssey G9 || Windows 10

Permalänk
Medlem

I C# läggs ju namespace till automatiskt om man kör Visual Studio. Det gör det inte i intelliJ? Alltså paket.

Visa signatur

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Skärm:Samsung Odyssey G9 || Windows 10

Permalänk
Medlem
Skrivet av Larsp777:

Ok, den lades till automatiskt.

IntelliJ kan antingen lägga till imports automatiskt eller bara när du ber om det (med alt+enter) beroende på konfiguration. Oavsett behöver man själv ha lite koll på att man inkluderar rätt saker.

Visa signatur

Spela Swemantle! Du vet att du vill.

Ibland har jag fel, men då är det någon annans fel.

Permalänk
Medlem
Skrivet av LemonIllusion:

IntelliJ kan antingen lägga till imports automatiskt eller bara när du ber om det (med alt+enter) beroende på konfiguration. Oavsett behöver man själv ha lite koll på att man inkluderar rätt saker.

Jo, så klart. Fick för mig att det var referens till Book-klassen.

Visa signatur

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Skärm:Samsung Odyssey G9 || Windows 10

Permalänk
Medlem

Ett annat problem:

Har samma klass med instansmetod:

public class Book { private String title; //Variabel som endast kan nås i klassen. private String author; private int price; //egenskaper (properties). Används för att förhindra åtkomst till privata variabler. //Getter for "title" public String getTitle() { return title; } // Setter for "title" public void setTitle(String title) { this.title = title; } //Getter for "author" public String getAuthor() { return author; } // Setter for "author" public void setAuthor(String author) { this.author = author; } //Getter for "price" public int getPrice() { return price; } // Setter for "price" public void setPrice(int price) { this.price = price; } //Contructor public Book(String title, String author, int price) { this.title = title; this.author = author; this.price = price; } //Empty contructor public Book() { } public void skrivUt() { System.out.println("\n"); System.out.println("Titel " + title); System.out.println("Författare " + author); System.out.println("Pris " + price); System.out.println(" "); } }

Sedan vill jag loopa igenom objektlistan och skriva ut värdena i main:

Book test2 = new Book("C# for Dummies", "Kalle Nilsson", 800); Book test3 = new Book("Python for Dummies", "Rita Hayworth", 800); Book test4 = new Book("HTML for Dummies", "Mahammad Ali", 800); Book test5 = new Book("CSS for Dummies", "Leif GW Persson", 800); List<Book> list = new ArrayList<>(); list.add(test2); list.add(test3); list.add(test4); list.add(test5); for (Book item : list) { System.out.println(item.skrivUt()); }

Då klagar kompilatorn att void inte är tillåtet. Förstår inte riktigt problemet.

Visa signatur

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Skärm:Samsung Odyssey G9 || Windows 10

Permalänk
Hedersmedlem
Skrivet av Larsp777:

Då klagar kompilatorn att void inte är tillåtet. Förstår inte riktigt problemet.

Ta gärna alltid med exakta meddelandet du får, det kan göra det mycket lättare att se felet. Gärna även markera i koden vilken rad den syftar på (eftersom vi inte har några radnummer).

Här är åtminstone problemet att skrivUt returnerar void, dvs inget, men du försöker ge dess returvärde till println inuti forloopen.
Eftersom skrivUt själv anropar println så räcker det att du kör item.skrivUt() i loopen så blir det rätt.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
NAS: 6700K/16GB/Debian+ZFS | Backup (offsite): 9600K/16GB/Debian+ZFS

Permalänk
Medlem
Skrivet av Thomas:

Ta gärna alltid med exakta meddelandet du får, det kan göra det mycket lättare att se felet. Gärna även markera i koden vilken rad den syftar på (eftersom vi inte har några radnummer).

Här är åtminstone problemet att skrivUt returnerar void, dvs inget, men du försöker ge dess returvärde till println inuti forloopen.
Eftersom skrivUt själv anropar println så räcker det att du kör item.skrivUt() i loopen så blir det rätt.

Ok, tack för tipsen.

Ok, så eftersom jag använder printline() i metoden behöver man inte använda det i loopen. Till skillnad om jag vill skriva ut ett bestämt värde som författare.

Visa signatur

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Skärm:Samsung Odyssey G9 || Windows 10

Permalänk
Hedersmedlem
Skrivet av Larsp777:

Ok, tack för tipsen.

Ok, så eftersom jag använder printline() i metoden behöver man inte använda det i loopen. Till skillnad om jag vill skriva ut ett bestämt värde som författare.

Ja, precis.
Det du kan göra (men inte nödvändigtvis bör) är att i loopen använda dina getters och t ex skriva ut

System.out.println("Titel " + item.getTitle());

Då ger du ett String-värde till println (eller i detta fallet till +-operatorn, men det fungerar även om du tar bort Titel-strängen och plusset), så det fungerar.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
NAS: 6700K/16GB/Debian+ZFS | Backup (offsite): 9600K/16GB/Debian+ZFS

Permalänk
Medlem
Skrivet av Thomas:

Ja, precis.
Det du kan göra (men inte nödvändigtvis bör) är att i loopen använda dina getters och t ex skriva ut

System.out.println("Titel " + item.getTitle());

Då ger du ett String-värde till println (eller i detta fallet till +-operatorn, men det fungerar även om du tar bort Titel-strängen och plusset), så det fungerar.

Tack igen!

Visa signatur

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Skärm:Samsung Odyssey G9 || Windows 10