Try statement doesn't always run? [duplicate] - c#

This question already has answers here:
Use of unassigned local variable with try-catch-finally
(4 answers)
Closed last year.
i encountered an error "Use of unassigned variable 'attempt'" when i run the code below, i don't understand the reason because as i understand the try statement block always runs so the variable should be assigned by the user ? Or am i wrong ? If anyone has i fix or work around that would be helpful.
static void MagicNumber(int rndMin, int rndMax, int lives = 4)
{
Random rnd = new Random();
int rndNum = rnd.Next(rndMin, rndMax);
int attempt;
do
{
try
{
Console.WriteLine($"Remaining lives : {lives}");
Console.WriteLine($"Enter a number between {rndMin} and {rndMax} :");
attempt = int.Parse(Console.ReadLine());
}
catch
{
Console.WriteLine("Error : Enter a number !");
}
} while ((lives > 0) || (attempt < rndMin) || (attempt > rndMax));
}
MagicNumber(1, 40, 5);

The variable attempt will not get assigned a value if an exception gets thrown in your try block, so will be unassigned when it gets to the evaluation in your while. The two possible solutions are:
Initialize it to a default value when you declare it.
Assign it some value in your catch block.
Either one should work.

An exception can be thrown in the try block prior to setting a value for attempt. You handle the exception so it's then possible for attempt to be referenced before being assigned a value.
Best practice is to always assign an initial value to variables.

Related

C# compile error Use of unassigned local variable [duplicate]

This question already has answers here:
Why did I get the compile error "Use of unassigned local variable"?
(10 answers)
What does "Use of unassigned local variable" mean?
(11 answers)
Closed 1 year ago.
Error: Use of unassigned local variable 'Datafiles'
I know this question is asked several times, but I don't see anything that suits my requirement. please help!
From the following code to check if files exists, I'm getting the following error, any suggestion on how to fix it, I've already included system.IO on top in namespaces
public void Main()
{
// TODO: Add your code here
string DataFilesLocation;
string[] DataFiles ;
DataFilesLocation = Dts.Variables["User::FolderPath"].Value.ToString();
if (DataFiles.Length > 0)
{
Dts.Variables["User::Flag"].Value = true;
}
Dts.TaskResult = (int)ScriptResults.Success;
}
Thanks fr your help in advance.
You need to assign both variables before you use them, and a best-practice in C# is to assign variables on the line you declare them, if you can.
So it should look something like:
string dataFilesLocation = Dts.Variables["User::FolderPath"].Value.ToString();
string[] dataFiles = System.IO.Directory.GetFiles(dataFilesLocation);
You never assign anything to DataFiles.
Try initializing it with an array size and populating those indexes, or assigning an array to it.
E.G
public void Main()
{
string DataFilesLocation;
// initializes your variable, removing the error you are getting
string[] DataFiles = new string[5];
//populates the array with file names
for(int i=0 ; i< 5 ; i++){
DataFiles[i]="FilePrefix"+i+".png";
}
DataFilesLocation = Dts.Variables["User::FolderPath"].Value.ToString();
if (DataFiles.Length > 0)
{
Dts.Variables["User::Flag"].Value = true;
}
Dts.TaskResult = (int)ScriptResults.Success;
}

How do I include a variable in the condition of a while loop if the variable is changed inside said loop in c#

I'm trying to have the user input a number from 1 to 5 and I want to loop back and have the user input another number if it isn't within those bounds. Here is the code:
int charNum = 0;
while(!((charNum > 0) && (charNum < 6)) ) {
int charNum = Convert.ToInt32(Console.ReadLine());
}
The above gives one error which says:
"A local or parameter named 'charNum' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter"
I've tried incorporating multiple variables but seem to encounter the same problem with changing variables inside a loop.
Is there a way to get around this or am I missing an easier solution?
You should never use Convert style methods and always use the TryParse style methods for user input... Users with dirty little fingers will type the wrong thing...
Here is an example which does all the above and your range check in the one line with a user message on failure
int charNum = 0;
while(!int.TryParse(Console.ReadLine(), out charNum ) || charNum < 0 || charNum >= 6)
Console.WriteLine("You had one job, now enter the number correctly");
You are trying to create another variable within your loop with the exact same name as the variable outside of the loop. You just need to assign a value to the variable, not declare it.
int charNum = 0;
while(!((charNum > 0) && (charNum < 6)) ) {
charNum = Convert.ToInt32(Console.ReadLine());
}
EDIT
I would also look at the post above, as it gives great insight into what not to do in this situation.
This is a very simple mistake. You're attempting to re-declare the charNum variable inside the loop. Simply remove the int and it becomes an assignment instead of a declaration.

How can I take a variable from an if statement in C# [closed]

Closed. This question is not reproducible or was caused by typos. It is not currently accepting answers.
This question was caused by a typo or a problem that can no longer be reproduced. While similar questions may be on-topic here, this one was resolved in a way less likely to help future readers.
Closed 2 years ago.
Improve this question
this might be a rather stupid question, but im new to this codeing thing. I was wondering if you can take a variable from an if statement and use it outside the if statement as I showed in this exemple down here:
bool ex = true;
if (ex == true)
{
int num = 10;
}
Console.WriteLine(num);
I already tried to declare the variable before the if statement but i gave me an error:
You can declare a variable before if statement and then you can bind a new value to that variable inside if statement and use it outside if statement wherever you required inside your function scope.
bool ex = true;
int num = 0;
if (ex == true)
{
num = 10;
}
Console.WriteLine(num);
Note that i have not used int keyword again while binding value to num variable in if statement as we have defined it already outside of the loop otherwise it will give an error like -> A local variable named 'num' cannot be declared in this scope because it would give a different meaning to 'num'.
Above the if statement write, "
int num;
"
and then inside the if statement write, "
num = 10;
"
You don't have to initialize a variable when you declare it.
The conceptual thing this example teaches is that of local variable scopes.
The body of a method (e.g., Main) is surrounded by { and } characters. This indicates that any variables you declare between these braces can only be written or read to from within the same braces. We call this a "scope". And this applies to most cases of { and } characters, nested within the method.
So in your case:
static void Main()
{ // beginning of method scope
bool ex = true;
if (ex == true)
{ // beginning of if statement scope
int num = 10;
} // end of if statement scope
Console.WriteLine(num);
} // end of method scope
There are two scopes: a scope for the Main method, and a scope within that first scope just for the code inside the { and } after the if.
ex is declared (bool ex) in the outer scope, so you can use it anywhere in the method, including within the inner scope.
num is declared (int num) in the inner scope, so you can only use it within the inner scope, not the outer scope.
To fix this, you can declare a variable, then later assign a value to it. So our next shot would be:
static void Main()
{
bool ex = true;
int num; // declare the variable here
if (ex == true)
{
num = 10; // assign the variable here
}
Console.WriteLine(num);
}
This is closer, but we still get an error, this time:
CS0165 Use of unassigned local variable 'num'
That's because of another rule: in order to use a local variable, the compiler has to be able to know that the variable has always been assigned a value before it's used. In this case, what would happen if ex was false? Then we would declare num, but never give it a value, because the program wouldn't enter into the if scope.
The solution is to give num a value, either at the same time we declare it...
static void Main()
{
bool ex = true;
int num = 5; // declare and assign the variable here
if (ex == true)
{
num = 10; // re-assign the variable here
}
Console.WriteLine(num);
}
...or in an else statement.
static void Main()
{
bool ex = true;
int num; // declare the variable here
if (ex == true)
{
num = 10; // assign the variable here if ex is true
}
else
{
num = 5; // assign the variable here if ex is false
}
Console.WriteLine(num);
}
In the first case, num is given a value as soon as we declare it, so even if we don't enter the if block, num will have a value when we reach Console.WriteLine.
In the second case, the compiler knows that when you chain if and else together, the program is going to go into exactly one of the two. Thus, if we ensure both paths set num, then it will also be guaranteed to have a value once we reach Console.WriteLine.

Why am I getting this exception

I have a System.Data.DataSet and 1 single table in it. The table has many columns.
In a certain event handler, I am setting a decimal value for one of the fields, in a data row which is already existing (at the time of setting).
In a very rare case, I am getting a ArgumentOutOfRangeException exception.
Message: System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Call Stack:
at System.ThrowHelper.ThrowArgumentOutOfRangeException()
at System.Collections.Generic.List`1.get_Item(Int32 index)
at System.Data.RecordManager.NewRecordBase()
at System.Data.DataTable.NewRecord(Int32 sourceRecord)
at System.Data.DataRow.BeginEditInternal()
at System.Data.DataRow.set_Item(DataColumn column, Object value)
at CPITS.Data.OrdersRow.set_ExecutionPrice(Decimal value)
Strange thing is, this is happening from the code which the framework has generated (Of course, I didn't write the Setter for the DataColumn).
Can you please help me understand & fix this problem?
EDIT
Below is the code where I am setting value:
void ibclient_OrderStatus(object sender, OrderStatusEventArgs e)
{
Data.OrdersRow drOrders = data.Orders.FindByOrderId(e.OrderId);
if (drOrders != null)
{
drOrders.FilledQuantity = e.Filled;
drOrders.ExecutionPrice = e.AverageFillPrice; //Sporadic Exception when setting a decimal value
}
}
Here is de decompiled code of RecordManager.NewRecordBase
internal int NewRecordBase()
{
int num;
if (this.freeRecordList.Count != 0)
{
num = this.freeRecordList[this.freeRecordList.Count - 1];
this.freeRecordList.RemoveAt(this.freeRecordList.Count - 1);
}
else
{
if (this.lastFreeRecord >= this.recordCapacity)
this.GrowRecordCapacity();
num = this.lastFreeRecord;
++this.lastFreeRecord;
}
return num;
}
as you can see, the only case where you could have a "index out of bounds" exception is here:
num = this.freeRecordList[this.freeRecordList.Count - 1];
since there DataTable is not thread safe, we could easily imagine a scenario where a record is removed by another thread before accessing the freeRecordList[..] but after having accessed to this.freeRecordList.Count.
In this case, freeRecordList.Count would have changed in the meanwhile => index out of bounds exception.
Thus, if I were you, I would try to find a concurrency issue (the fact that it happens in rare cases is another argument !)
Check the number of decimal places you are allowing in your table and check how many decimals the number you are committing has.
This exception can be thrown if the number of decimals is out of range.
DataTable.GetErrors Method
Gets an array of DataRow objects that contain errors.

Cannot use local variable before it is declared

I am trying to create a function but I'm getting an error message.
public int[] genericSearch(int searchWidth, int startingRadius, int width, int height, Bitmap bitmap)
{
//Generic function for finding the best path from a certain range
if (startingRadius == -1)
startingRadius = bitmap.Height() / 2;
Cannot use local variable 'startingRadius' before it is declared.
The same problem occurs for the bitmap variable as well. Normally in c++ this type of declaration would work; however, I am unsure why it is not working here.
In visual studio. Sometimes when you declare a variable again (a second time). It will give this error. For example, this will sometimes throw the exception you mentioned:
1. int startingRadius = 0;
2. startingRadius = 5; <-- Exception thrown here.
3.
4. int startingRadius = 0;
Obviously this is incorrect anyway. So removing the second declaration (on line 4) will solve the problem.
Note: The exception you would ordinarily expect would be A local variable named 'startingRadius' is already defined in this scope. But for some reason, the exception you mentioned is shown sometimes.
You are missing a closing brace for your method but otherwise this code can compile on my machine... (changed Height to a property as well)
public int[] genericSearch(int searchWidth, int startingRadius, int width, int height,Bitmap bitmap)
{
//Generic function for finding the best path from a certain range
if (startingRadius == -1)
startingRadius = bitmap.Height / 2;
}
It sounds like you have a misplaced } or misspelled variable names. I can't really tell without seeing the full code.
The error message is basically telling you that you have a local variable that you are trying to use which has not been declared. Which suggests that the if (startingRadius == 1) code is actually inside a different method than the method you have declared.
For me it helped to delete to local variable at all and create a new with different name...
Originally:
string butterfly;
butterfly = "butterfly with error"; <-- gives error
UPDTE:
Delete all the existing "butterfly"s and create new with new very similar name
string butterfly2;
butterfly2 = "butterfly without error" <-- worked for me perfectly.
*First tried:
clean and rebuild project - didn't help
restart whole program(IDE) - didn't help*
Change the variable name for example "butterfly" to "Butterfly" and declare it
under public partial class Form1 : Form
{
This is exactly where you have to declare it. It will then have scope for the entire class.
It worked for me.

Categories