Permalänk
Medlem

Vad har jag gjort för fel?

Programmet ska avslutas om användaren skicka in en tom text sträng.... vad har jag glömt eller satt på fel plats?
Nu fortsätter det att skriva ut "Skriv din text här:" även om jag bara trycker Enter å skickar in en tom sträng...

package TeckenKlass; import java.io.*; public class testa { public static void main(String[] args) throws IOException{ FileWriter output = new FileWriter("Text.txt"); BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); while (true) { System.out.println("Skriv din text här:"); String s = input.readLine(); if (s == null) break; output.write(s); } output.close(); } }

Permalänk
Medlem
Skrivet av Pensum:

Programmet ska avslutas om användaren skicka in en tom text sträng.... vad har jag glömt eller satt på fel plats?
Nu fortsätter det att skriva ut "Skriv din text här:" även om jag bara trycker Enter å skickar in en tom sträng...

package TeckenKlass; import java.io.*; public class testa { public static void main(String[] args) throws IOException{ FileWriter output = new FileWriter("Text.txt"); BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); while (true) { System.out.println("Skriv din text här:"); String s = input.readLine(); if (s == null) break; output.write(s); } output.close(); } }

Om du testar att skriva ut vad 's' är innan ifsatsen så kommer du se att den inte är Null, utan snarare "" eller innehåller Entertecknet.

Permalänk
Medlem

Ditt problem är att variabeln s aldrig blir null. Eftersom du tilldelar den input värdet från tangentbordet. prova

String s = input.readLine();
if (s.equals(""))
break;

alltså en tom sträng, vilket den är om input inte innehåller något. Strängen blir endast null om du deklarerar variabeln men inte tilldelar den ett värde. För övrigt bör man ha för vana att deklarera variabeln utanför loopen och sedan tilldela den ett värde i loopen. Nu för tiden hanterar oftast kompilatorn detta men tidigare och i andra mer primitiva språk allokerar du nytt arbetsminne för variabeln i varje iteration . Man bör även generellt försöka undvika att basera villkor på "nullkonditions". Man vill inte ha NULL värden i sitt program utan endast fånga upp och hantera dessa i ett exception om de skulle uppstå. Man bör sikta på att en variabel aldrig har värdet NULL eller aldrig används/utvärderas om det inte blivit tilldelat. Vissa klasser har inbyggda metoder som hanterar detta som t.ex. "isEmpty()" eller liknande, vilket oftast är en mer utvecklad variant av en "nullcheck".

Edit: insåg att tidigare inlägg och förklarade detta, bara jag som läste lite hastigt...

Mvh Oscar

Permalänk
Medlem

@Oscode: Jag har sett att det är ganska vanligt att vända på jämförelsen i Java, d.v.s. "".equals(s). Det gör då inget om s är null, eftersom equals kontrollerar om argumentet är null innan jämförelsen utförs.

readLine kan enligt dokumentationen returnera null, även om jag inte riktigt vet i vilken situation det skulle kunna hända när man läser från System.in. Men då är vi nog inne på överkurs

Permalänk
Medlem
Skrivet av perost:

@fnoessse: Jag har sett att det är ganska vanligt att vända på jämförelsen i Java, d.v.s. "".equals(s). Det gör då inget om s är null, eftersom equals kontrollerar om argumentet är null innan jämförelsen utförs.

readLine kan enligt dokumentationen returnera null, även om jag inte riktigt vet i vilken situation det skulle kunna hända när man läser från System.in. Men då är vi nog inne på överkurs

absolut, det går ju utmärkt att göra jämförelse med en sträng på det viset. Som jag påpekade så finns det klasser som innehåller metoder med nullcheck hantering. String i java är ju en java konstruerad objekt klass och metoden equals precis som isempty etc kan hantera en kontroll på null objekt utan att generera exception.

Som du säger så gör det inget om variabeln s är null. Detta bör dock fångas med exception handling om det uppstår vid t.ex. en jämförelse så som OP skrivit villkoret i ifsatsen. Jag menade mest att så som jag lärt mig bör man i största möjliga mån undvika argument som kontrollerar om en variabel är null, de fyller oftast ingen bra funktion.

Det är nog lite överkurs ja Första tanken som slår mig är att om systemet inte kan hitta korrekt i/o för System.in så skulle det kunna returnera null. Det finns säkert ett antal orsaker om dokumentationen säger att null kan returneras.

Permalänk

Har ingen kolla på Java, men C# har ju hämtat en del från just Java så det borde kanske finnas någon liknande metod där man kan kolla om en sträng är "null or empty"?

Visa signatur

MSI B450 TOMAHAWK,Amd Ryzen 7 2700x,Evga geforce 980ti