pettssonMedlem sedan jan. 20021 122 inlägg Är nu så ful så jag lägger in hela min kod här när jag ändå frågar så kanske nån hittar nåt annat fel... :e
Uppgift:
Skapa en klass Person som kan samla in/skriva ut information om ett antal personer. Uppgifterna om varje person är namn och personnummer.
Problemet(eller ett urval snarare):
1. När jag försöker anropa en metod ur Person tycker den att jag inte kan göra ett statiskt anrop till den icke-statiska metoden. Att göra metoderna statiska verkar bara ge andra fel.
2. Jag ska spara de data jag samlar in i programmet, så jag tänkte att man gör en Person-array, men hur gör man en array så att den utökas med ett element så fort jag väljer att skapa en ny uppsättning information?
3. Får av och till felet att MenyVal kan användas innan den initieras. Antar att den menar att ett undantag kastas om jag trycker nånstans innan den kommer tillräckligt långt?
Sedan undrar jag vilken av de två tangentbords-inputfunktionerna som är bäst, och om det finns bättre sätt att lösa det på? System.in.read eller BufferedReader?
import java.io.*;
public class Lab1
{
class Person
{
private String Namn;
private int Personnummer;
private int PersonerSkapade;
public void InputNyPerson()
{
try
{
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Skriv in namn: ");
Namn = in.readLine();
System.out.print("\nSkriv in Personnummer: ");
Personnummer = (int)System.in.read();
}
catch(IOException i)
{
System.out.println(i);
}
}
//De nedanstående metoderna är inte färdiga, eller ens påtänkta än...
public void GetPersonInfo()
{
int PersonAttKolla;
try
{
PersonAttKolla = (int)System.in.read();
System.out.println(MyPerson[PersonAttKolla - 1]);
}
catch(IOException i)
{
System.out.println(i);
}
}
public void ChangePersonInfo()
{}
public void ComparePersonInfo()
{}
public void PrintPersonInfo()
{}
}
public static void main (String [] args)
{
Person[1] MyPerson = new Person[1];
System.out.println("Personprogram\n");
System.out.println("1. Skriv in en ny person");
System.out.println("2. Hämta uppgifter om person");
System.out.println("3. Ändra en persons uppgifter");
System.out.println("4. Jämför två personer");
System.out.println("5. Skriv ut uppgifter om en person");
System.out.println("0. Avsluta");
int MenyVal;
try
{
System.out.print("\nVälj alternativ: ");
MenyVal = System.in.read();
}
catch(IOException i)
{
System.out.print(i);
}
switch(MenyVal)
{
case 1:
Person.InputNyPerson();
break;
case 2:
Person.GetPersonInfo();
break;
case 3:
Person.ChangePersonInfo();
break;
case 4:
Person.ComparePersonInfo();
break;
case 5:
Person.PrintPersonInfo();
break;
case 0:
//Avslutningskod?
break;
default:
//Input igen... Hur?
break;
}
}
}
ViktorMedlem sedan aug. 20021 752 inlägg Re: Icke-statiska anrop och klassarrayer
pettsson skrev:
1. När jag försöker anropa en metod ur Person tycker den att jag inte kan göra ett statiskt anrop till den icke-statiska metoden. Att göra metoderna statiska verkar bara ge andra fel.
En statisk funktion eller variabel finns alltid, även när du inte har skapat något objekt av en klass så kan du anroppa statiska funktioner och variabler, för de finns ju alltid. Statiska funktioner och variabler finns också bara i 1 exemplar, de är samma i varje objekt av en klass. Om du ändrar värdet i ett objekt så är det ändrat i alla andra också.
Anledningen till att du inte kan anroppa icke statiska funktioner eller variabler från statiska är för att de statiska alltid finns och då finns det ingen garanti för att det finns ett objekt där den icke statiska funktionen finns i, och vilket objekts ska man välja när det finns 1000 stycken av samma sort?
Det lättaste sättet att lösa detta problem på är att man skapar en konstruktor som tar en string array (om du har användning av den) och sedan det första man gör i programmet är att skapa ett objekt av klassen och bara arbeta i det objektet.
public class Kalle
{
public static void main(String args[])
{
new Kalle(args);
}
public Kalle(String args[])
{
//Gör allt som du gör i main idag i denna icke statiska funkton
}
pettsson skrev:
2. Jag ska spara de data jag samlar in i programmet, så jag tänkte att man gör en Person-array, men hur gör man en array så att den utökas med ett element så fort jag väljer att skapa en ny uppsättning information?
Titta i Java API dokumentationen på Collection klasserna. Där finns det många fina dynamiska samlings klasser
pettsson skrev:
3. Får av och till felet att MenyVal kan användas innan den initieras. Antar att den menar att ett undantag kastas om jag trycker nånstans innan den kommer tillräckligt långt?
Ha som vana att alltid tilldela variabler värden när du deklarerar dem, då slipper du alla sådanna fel och det ger även snyggare kod tycker jag.
Problemet i detta fall är att om System.out.print eller System.in.read kastar ett IOException så får inte MenyVal något värde och det tycker inte Java om, det finns då risk för att det blir fel senare i koden och Java är gjort för att minimera de riskerna.
Lös problemet på följande sätt,
int MenyVal=0; //eller -1
try
{
System.out.print("\nVälj alternativ: ");
MenyVal = System.in.read();
}
catch(IOException i)
{
System.out.print(i);
}
switch(MenyVal)
/Viktor
pettssonMedlem sedan jan. 20021 122 inlägg Jag flyttade nu hela innehållet i main() till en public Huvudklass(), men jag får fortfarande samma fel? Allt annat fungerar i och för sig, men det känns som om dessa funktioner är ganska kritiska... ;)
ViktorMedlem sedan aug. 20021 752 inlägg Vilket fel får du? static felet? Kolla så att du inte har några static variabler eller funktioner kvar i din klass förutom main funktionen. Om du ändå inte hittar felet släng då ut koden här så får vi se om vi kan hitta felet :)
/Viktor
pettssonMedlem sedan jan. 20021 122 inlägg Jahapp, då kommer den då
import java.io.*;
public class Lab1
{
class Person
{
private String Namn;
private int Personnummer;
private int PersonerSkapade;
public void InputNyPerson()
{
try
{
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Skriv in namn: ");
Namn = in.readLine();
System.out.print("\nSkriv in Personnummer: ");
Personnummer = (int)System.in.read();
}
catch(IOException i)
{
System.out.println(i);
}
}
public void GetPersonInfo()
{
int PersonAttKolla;
try
{
PersonAttKolla = (int)System.in.read();
System.out.println("");
}
catch(IOException i)
{
System.out.println(i);
}
}
public void ChangePersonInfo()
{}
public void ComparePersonInfo()
{}
public void PrintPersonInfo()
{}
}
public Lab1()
{
//void Start()
//{
int MenyVal = 0;
System.out.println("Personprogram\n");
System.out.println("1. Skriv in en ny person");
System.out.println("2. Hämta uppgifter om person");
System.out.println("3. Ändra en persons uppgifter");
System.out.println("4. Jämför två personer");
System.out.println("5. Skriv ut uppgifter om en person");
System.out.println("0. Avsluta");
try
{
System.out.print("\nVälj alternativ: ");
MenyVal = System.in.read();
}
catch(IOException i)
{
System.out.print(i);
}
switch(MenyVal)
{
case 1:
Person.InputNyPerson();
break;
case 2:
Person.GetPersonInfo();
break;
case 3:
Person.ChangePersonInfo();
break;
case 4:
Person.ComparePersonInfo();
break;
case 5:
Person.PrintPersonInfo();
break;
case 0:
break;
default:
break;
}
//}
}
public static void main (String [] args)
{
new Lab1();
}
}
ViktorMedlem sedan aug. 20021 752 inlägg Det är inget fel med den koden, den kompilerar perfekt på min dator. Kontrolera så att alla gammla klass filer är borta och kompilera igen.
/Viktor
pettssonMedlem sedan jan. 20021 122 inlägg Oops :r Jag kommenterade de rader som ställde till problem vid kompileringen för att kolla om det var fler fel. Sen glömde jag visst att ta bort kommenteringen :r
pettssonMedlem sedan jan. 20021 122 inlägg Tog en titt på Collections som du rekommenderade, men jag kan inte köra exemplen, det verkar som om min kompilator inte kan hitta Collections... Ska jag uppdatera min JavaVM eller ny SDK eller hur gör jag? Jag kör just nu MS J++
PhorpherMedlem sedan feb. 20002 300 inlägg Du ska sluta använda ms j++ helt och ladda ner t.ex. SUNs SDK.
http://java.sun.com/j2se/
pettssonMedlem sedan jan. 20021 122 inlägg Men, va jobbigt... Sitter ju och kör resten av Visual Studio, varför inte J++? Går det inte att uppgradera vilken version av Java som används?
PhorpherMedlem sedan feb. 20002 300 inlägg Microsoft slutade utveckla J++ för längesedan och stöder inte längre någon javaversion utan kör på C# istället. Som sagt. Byt till t.ex. j2se och ladda ner någon utvecklingsmiljö. T.ex. Eclipse.