Vinnaren i pepparkakshustävlingen!
2018-02-28, 18:38
  #1
Medlem
Ny dag, nya problem.. Jag försöker få till detta med exception try, Catch. Problemet när jag försöker att använda den är att jag får upp felmeddelande: En lokal variabel som inte har tilldelats används: fahr.

Innan jag skrev in try, catch koden så fungerade allt jättebra, så jag undrar vad det är jag missar? Kan tillägga att det är just denna fahr: celsius = FahrToCels(fahr) som felmeddelandet pekar på.


Kod:
public static double FahrToCels(int fahr//metod för att omvandla fahrenheit till celsius och avrunda till heltal eller 0,5
        
{
            
double newfahr fahr;
            
double celsius = (newfahr 32) * 9;
            
double newcelsius Math.Round(celsius 2) / 2//avrundar till heltal eller 0,5
            
return newcelsius;
        }
        
        public static 
void Main(string[] args)
        {
            
int fahr;
            
double celsius;
            
            do
            {
                
Console.WriteLine("Ange temperatur");
                try
                {
                
fahr int.Parse(Console.ReadLine());
                }
                catch
                {
                
Console.WriteLine("Fel: Du kan bara skriva in heltal!");
                }
                
                
celsius FahrToCels(fahr);
                
                
                
Console.WriteLine("Ditt val i Fahrenheit blir {0} celsius"celsius);
                
            }
            while(
celsius <= 73 || celsius >= 77);
            
Console.ReadKey();
        } 
Citera
2018-02-28, 20:09
  #2
Medlem
Byt
Kod:
int fahr;
till
Kod:
int fahr = 0;

Anledningen är att variabeln kanske aldrig har fått något värde om något går fel inne i try-satsen, så kompilatorn säger ifrån. Att sätta ett default-värde löser problemet.
Citera
2018-02-28, 20:16
  #3
Medlem
Funkade galant! Tusen tack
Citera
2018-02-28, 20:26
  #4
Medlem
Lugnt Dock så skulle jag ha flyttat in även dessa två rader in i try{}:

Kod:
celsius = FahrToCels(fahr);               
Console.WriteLine("Ditt val i Fahrenheit blir {0} celsius", celsius); 

Annars kommer det skrivas ut även om du inte anger ett giltigt heltal, fast för fahrenheit = 0 då.
Citera
2018-02-28, 20:34
  #5
Medlem
ChristianXs avatar
Citat:
Ursprungligen postat av Runningsnail
Funkade galant! Tusen tack
Det är för övrigt snyggare att inte använda try/catch som programlogik på det sättet eftersom man mer eller mindre förväntar sig att något annat än heltal nån gång trycks in.

Du har också problem med att även om du catchar felet nu så kommer den fortsätta exekvera.

Istället för int.Parse() kan du använda int.TryParse().

Typ så här:

Kod:
                Console.WriteLine("Ange temperatur"); 

                if(!int.TryParse(Console.ReadLine(), out fahr))
                { 
                Console.WriteLine("Fel: Du kan bara skriva in heltal!"); 
                 }
                 else
                 {
                celsius = FahrToCels(fahr); 
                 
                Console.WriteLine("Ditt val i Fahrenheit blir {0} celsius", celsius); 
                 }
Citera
2018-02-28, 22:04
  #6
Medlem
Citat:
Ursprungligen postat av pr0ph3t
Lugnt Dock så skulle jag ha flyttat in även dessa två rader in i try{}:

Kod:
celsius = FahrToCels(fahr);               
Console.WriteLine("Ditt val i Fahrenheit blir {0} celsius", celsius); 

Annars kommer det skrivas ut även om du inte anger ett giltigt heltal, fast för fahrenheit = 0 då.
Jag märkte det, men jag fixar det på ett annat sätt, bara för att få prova på lite olika saker. Men tack ändå

Citat:
Ursprungligen postat av ChristianX
Det är för övrigt snyggare att inte använda try/catch som programlogik på det sättet eftersom man mer eller mindre förväntar sig att något annat än heltal nån gång trycks in.

Jag började med programmering förra veckan så jag lär mig fortfarande. Jag kan nog hålla med om att det skulle bli bättre utan try/catch, men det var just det jag tänkte prova nu och få det att fungera Försöker liksom göra det lite krångligt för att bättre lära mig förstå vad som funkar och inte funkar, om du förstår vad jag menar
Citera
2018-03-01, 08:44
  #7
Medlem
ChristianXs avatar
Citat:
Ursprungligen postat av Runningsnail
Jag började med programmering förra veckan så jag lär mig fortfarande. Jag kan nog hålla med om att det skulle bli bättre utan try/catch, men det var just det jag tänkte prova nu och få det att fungera Försöker liksom göra det lite krångligt för att bättre lära mig förstå vad som funkar och inte funkar, om du förstår vad jag menar
Absolut, att misslyckas är bästa sättet att lära sig på. Det var inte kritik, eftersom din lösning också fungerar utan mer att det var en bra sak att tänka på.

Om man själv kan förutse ett fel så är det alltid bättre att hantera det i sin kod än att låta en try/catch göra det. Try/catch bör man bara använda för att ta hand om fel man inte förutsett i största möjliga mån. Det finns dessutom prestandamässiga skäl till att låta bli try/catch i onödan och inte bara när den catchar eftersom det kan påverka kompilatorns möjlighet till optimering när man kompilerar.

Lycka till!
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback