2015-10-15 201 views
-3

我有以下代码。异常处理?

using System; 
using System.IO;       

class ExceptionHandling 
{ 
    public static void Main() 
    { 
     StreamReader streamReader = null; 
     try 
     { 
     streamReader = new StreamReader("C:\\Sample Files\\Data.txt");  
     Console.WriteLine(streamReader.ReadToEnd());        
     } 

     catch(FileNotFoundException ex)           
     {  
      Console.WriteLine("Please check if the file {0} exists",ex.FileName); 
     } 
     catch(Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
     finally 
     { 
      if (streamReader !=null)     
      { 
      streamReader.Close(); 
      } 
      Console.WriteLine("FInally Block"); 
     } 
    } 
} 

我的问题如下:

1)StreamReader streamReader = null;为什么StreamReader的分配为空?

2)streamReader = new StreamReader我只是想澄清一下。 StreamReader引用变量是否指向StreamReader对象?

3)如果streamReader = new StreamReader("C:\\Sample Files\\Data.txt");发生异常,streamReader是否仍然打开?

4)既然我们写了StreamReader streamReader = null;不是streamReader总是为null,因此在Finally块中不可能关闭吗?

5)我不知道FileNotFoundException exException ex是如何工作的。是不是ex对象引用变量,并且只有当我们将它们分配给诸如Exception ex = new Exception之类的对象时,它才会起作用?

+7

问题太多。阅读文档和C#图书的良好开端是您应该开始的地方。 –

回答

3
  1. 这种说法意味着,以后,如果你想检查的StreamReader被正确打开,你可以做streamReader == null

  2. 此实例StreamReader对象的一个​​新实例从一个路径。

  3. 否streamReader不会打开并引发异常。

  4. 在finally块中,如果发生异常,并且如果没有发生异常,将会运行。因此,处理任何分配的系统资源非常重要。

  5. FileNotFound在打开streamReader时抛出,但是异常ex是任何其他异常的一般情况。

在StreamReader的一些一般信息它是从System.IO.Stream对象继承的类(具有类似的性质)。它在实例化时分配系统资源,并声明自己正在读取某个流(在这种情况下是文件流)。因此,如果您实例化streamReader,则需要关闭它,以便其他应用程序可以访问该资源。

它阻止其他应用程序读取资源的原因是为了防止发生多线程问题,即一个应用程序读取文档,程序员假定文档在程序打开文档时以及关闭时间之间不变它。如果有其他程序出现并更改了某些文本,则原始程序可能会崩溃并导致蓝屏死机。

+0

就像你说的那样,如果streamReader不会打开并抛出异常,为什么我们不得不在finally块中关闭它? – jelly

+2

如果没有抛出异常,你仍然需要处理streamReader – Cjen1

+0

Cjen 1非常感谢。我一直在学习教程,所以没有关于处理streamReader和资源等方面的任何信息。请告诉我他们是什么。 – jelly

2
  1. 这只是streamReader变量初始化为null。如果您没有初始化该值,则会在fianally块中发现有关使用未初始化变量的编译器错误。

  2. 是的。

  3. 不,但有可能StreamReader构造函数会成功,但streamReader.ReadToEnd()的调用将抛出异常。在这种情况下,您将有一个开放的streamReader

  4. 不,请参阅上述答案。

  5. 不同的catch块允许您处理不同类型的错误。只有一个catch块会处理任何给定的异常。 C#将找出您处理的最具体的异常,并确保您输入该块。异常(ex)的实际实例将被构造并由框架传递给块。你不需要做任何明确的事情。

+0

非常感谢您的回答。这真的很有帮助,但在答案3中,可以解释StreamReader构造函数何时会成功,但是对streamReader.ReadToEnd()的调用会抛出异常? – jelly

+0

@jelly - 如果您查看该方法的文档,那么有一个“Exceptions”部分,可以准确告诉您某个方法可能抛出哪些异常以及原因是什么:https://msdn.microsoft.com/en-us /library/system.io.streamreader.readtoend(v=vs.110).aspx –