初次使用try-catch遇到的问题
class UseException
{
private int smallNum;
public UseException()
{
smallNum=0;
}
public UseException(int num)
{
if(num>100)
throw new ArgumentOutOfRangeException("输入值太大");
else
smallNum=num;
}
public int SmallNum
{
get
{
return smallNum;
}
}
}
class Test
{
static void Main(string[] args)
{
try
{
UseException example=new UseException(10);
}
catch(ArgumentOutOfRangeException e)
{
Console.WriteLine(e.Message);
}
Console.WriteLine("number={0}",example.SmallNum);
}
}
{
private int smallNum;
public UseException()
{
smallNum=0;
}
public UseException(int num)
{
if(num>100)
throw new ArgumentOutOfRangeException("输入值太大");
else
smallNum=num;
}
public int SmallNum
{
get
{
return smallNum;
}
}
}
class Test
{
static void Main(string[] args)
{
try
{
UseException example=new UseException(10);
}
catch(ArgumentOutOfRangeException e)
{
Console.WriteLine(e.Message);
}
Console.WriteLine("number={0}",example.SmallNum);
}
}
编译时出错:找不到类型或命名空间名称“example”(是否缺少 using 指令或程序集引用?)
但是如果将初始化语句改成UseException example=new UseException(1000);则可以抛出异常,去掉try-catch块后也可以运行。
我在CSDN上问了一下,得到的答复是
“因为你的example是在try块里面定义的,出了try块就被释放掉,执行到
Console.WriteLine("number={0}",example.SmallNum);
就会说找不到这个对象。
你初始值为1000,
if(num>100)
throw new ArgumentOutOfRangeException("输入值太大");
就会被抛出一个异常,能够被捕获到。”
并且看到了个解决方法,将try-catch结构改成:
UseException example=null;
try
{
example=new UseException(10);
}
catch(ArgumentOutOfRangeException e)
{
Console.WriteLine(e.Message);
}
Console.WriteLine("number={0}",example.SmallNum);
try
{
example=new UseException(10);
}
catch(ArgumentOutOfRangeException e)
{
Console.WriteLine(e.Message);
}
Console.WriteLine("number={0}",example.SmallNum);
null不能丢,否则一样报错。得到的解释是:
“在一个方法里,通过一个引用调用一个对象的方法(或属性)之前,此引用必须先被定义或赋值”
我觉得try-catch在在方面与函数类似。比如
class c1
{
public static int i=0;
}
class Test
{
public static void fun()
{
c1.i+=6;
}
static void Main(string[] args)
{
fun();
Console.WriteLine("i="+c1.i);
}
}
{
public static int i=0;
}
class Test
{
public static void fun()
{
c1.i+=6;
}
static void Main(string[] args)
{
fun();
Console.WriteLine("i="+c1.i);
}
}
c1.i的值可以被Test.fun方法所影响。当然,如果把c1.i的static去掉,再在fun里重新初始化一个对象,就不会被改动
class c1
{
public int i=0;
}
class Test
{
public static void fun()
{
c1 c=new c1();
c.i+=6;
}
static void Main(string[] args)
{
c1 c=new c1();
fun();
Console.WriteLine("i="+c.i);
}
}
{
public int i=0;
}
class Test
{
public static void fun()
{
c1 c=new c1();
c.i+=6;
}
static void Main(string[] args)
{
c1 c=new c1();
fun();
Console.WriteLine("i="+c.i);
}
}