2014-06-12 4 views
-2

null 테스트가 통과 된 가짜 경로가 전달 된 경우에도 아래 코드에서 Null을 확인합니다. 그러나 통합 문서를 반환하면 NullPointerException이 throw됩니다. 이 경우 NullPointerReference를 어떻게 확인할 수 있습니까? 디버깅 중에 workBook 변수를 검사 할 때 변수가 설정되면 Null 검사를 통과해야하는 이유가 여기에 있어야합니다.null 테스트를 통과 한 다음 NullPointerException을 throw합니다.

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; 

    } 
} 

답변

3

the source code for ExcelPackage에서 보면, Workbook 속성은 null를 반환 할 수 없다. 그것의 내부 필드 null 것을 발견하면 그 게터 새로운 Workbook을 생성합니다 :

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 개체를 올바르게 처리하십시오.

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

    그리고 모든 것이 잘 정리 얻을 것이다 : 당신이 당신의 래퍼를 인스턴스화 할 때마다 using을 사용, 이제 대신

    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); 
        } 
    } 
    

    :

여기에 예를 들어 *입니다.


* 클래스의 이름을 변경하십시오/더 적절한 뭔가 방법; 이것은 단지 설명을위한 것이 었습니다.

관련 문제