传递null测试然后抛出NullPointerException

时间:2014-06-12 21:30:28

标签: c# nullpointerexception epplus

我在下面的代码中检查Null,即使传递了一个虚假路径,也会传递null测试。但是,当我返回工作簿时,抛出NullPointerException。在这种情况下,如何检查NullPointerReference?当我在调试时检查workBook变量时,它被设置为某个东西,我相信这一定是它传递Null检查的原因。

public static ExcelWorkbook OpenExcelWorkSheet(string file_path)
{
    string EXCEL_FILE_EXTENSION = ".xlsx",
    full_path = file_path + EXCEL_FILE_EXTENSION;
    var excelFile = new FileInfo(full_path);
    using (var package = new ExcelPackage(excelFile))
    {
        ExcelWorkbook workBook = package.Workbook;
        if (workBook.Equals(null))
        {
            throw new Exception("ERROR!!!");
        }
        else { Console.Write("not null"); }
        return workBook;

    }
}

1 个答案:

答案 0 :(得分:3)

查看the source code for ExcelPackageWorkbook属性永远不会返回null。如果它的内部字段为Workbook,则其getter将创建一个新的null

public ExcelWorkbook Workbook
{
    get
    {
        if (_workbook == null)
        {
            var nsm = CreateDefaultNSM();

            _workbook = new ExcelWorkbook(this, nsm);

            _workbook.GetExternalReferences();
            _workbook.GetDefinedNames();

        }
        return (_workbook);
    }
}

知道这一点,我认为你可以安全地完全取消支票。

此外,正如其他人所说,您需要注意如何使用using语句。处置ExcelPackage后,其Workbook将被处理(您可以在我链接的源代码中看到这种情况)。这可能是您看到从您的方法返回null工作簿的原因,但并非您在using语句中。在}关闭using之后不久,它就变为null

如果您有一个类用于包装EPPlus的功能,那么您应该确保它:

  1. 仅实例化ExcelPackage一次,并保留对它的引用;执行此操作时不要使用using语句
  2. 让其他方法在需要时访问此ExcelPackage引用;不要传递它或重新打开包
  3. 实施IDisposable,然后在处理包装时正确处置ExcelPackage对象。
  4. 这是一个例子*:

    public class YourWrapper : IDisposable
    {
        private bool disposed;
    
        public YourWrapper()
        {
        }
    
        public YourWrapper(string path)
        {
            OpenExcelPackage(path);
        }
    
        public void OpenExcelPackage(string path)
        {
            Package = new ExcelPackage(path);
        }
    
        public ExcelPackage Package { get; private set; }
    
        protected virtual void Dispose(bool disposing)
        {
            if (!this.disposed)
            {
                if (disposing)
                {
                    if (Package != null)
                    {
                        Package.Dispose();
                        Package = null;
                    }
                }
            }
            this.disposed = true;
        }
    
        ~YourWrapper()
        {
            Dispose(false);
        }
    
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
    }
    

    现在,只要您实例化包装器,就使用using

    using (var wrapper = new YourWrapper())
    {
        // Do everything related to manipulating the Excel file here
    }
    

    一切都会得到很好的清理。


    * 请将类/方法的名称更改为更合适的名称;这只是为了说明。