I have a ',' 이 때 일부 코드와 실행하므로 던지는 누얼레페렌스엑스티온 말했다.
설정되지 않은 객체를 인스턴스입니다 >, 개체 참조.
이게 무슨 뜻이죠 오류 및 어떻게 해야 합니까?
틀렸다니까 사용하려는 생각하신거야 는 'null' (또는 '아무것도아니야' 이 (VB.NET). 즉, 집합 또는 아무것도 할 수 없다 'null', 즉 인컨텍스트 redhat. 전혀. 통과 등 다른 사항은요, 'null' 가 있다. , 메서드입니다 " A" 'null' 의 경우, 이 방법을 ", B" 걸릴 수 있다. , 방법, A" " 'null' 을 통과시켰다. 'null' 다른 의미를 가질 수 있습니다.
string foo = null;
foo.ToUpper();
이렇게 하면 누얼레페렌스엑스티온 던질 수 있기 때문에 a ',' 의 두 번째 선 () '에서' 토퍼 can& # 39 t security. 인스턴스입니다 방법을 가리키는 'string' 참조 'null'.
출처를 누얼레페렌스엑스티온 '' 어떻게 찾아요? 이와는 별도로 예외가 될 수 있는 위치에 정확히 던져 그 자체를 바라보는 일반적인 규칙을 발생하면 디버깅 비주얼 스튜디오에서 적용됩니다. 중단점 战略性 배치하십시오 및 [검사 변수를] (https://msdn.microsoft.com/en-us/library/esta7c62.aspx) 을 놓아 (빠른) 제스쳐놀이처럼 창을 열면 마우스를 그들위에 이름, 또는 사용하여 지역 및 자동차 등 다양한 디버깅하지 패널. 위치를 확인할 수 있고, 스케쳐내 이름을 선택하고 마우스 오른쪽 단추로 클릭하고 참조 isn& # 39 설정되었습니다 " References" 모두 찾을 수 없다;;). 그런 다음 프로그램을 통해 자신의 위치를 찾을 때마다 정지점을 배치하십시오 실행하십시오 디버거 첨부됩니다. 디버거 브레이크를 때마다 이런 정지점을 작성하든지 작성되지는 참조입니다 null 이 아닌, 검사, 결정해야 합니다 수 있다는 점을 확인하고 충족되었으며 인스턴스 변수 (variable) 및 때는사용할 것으로 예상하고 있습니다. 이렇게 프로그램 흐름에 따라 위치를 찾을 수 있습니다, t, 왜 안 인스턴스입니다 널일 isn& # 39 이 제대로 설정되었습니다.
몇 가지 일반적인 경우를 제외하고는 마운드에 설 수 있습니다.
ref1.ref2.ref3.member
Ref1 경우 'll get a # 39, 또는 ref2 또는 ref3 널임 관심용 you& 누얼레페렌스엑스티온'. 문제를 해결하기 위해 스케쳐내 의해 그 후 다시 확인해 어느쪽이야 널임 표현식에서는 간단해진다는 avamer:
var r1 = ref1;
var r2 = r1.ref2;
var r3 = r2.ref3;
r3.member
특히, 이 '수' 에서 ',' 또는 '사용자' 하테프콘테스t.c해류윈저리이덴스티그나미 하테프콘테스트롬커렌트 널일, 아이디 '또는' 속성 속성 널일 널일 할 수 있다.
public class Person {
public int Age { get; set; }
}
public class Book {
public Person Author { get; set; }
}
public class Example {
public void Foo() {
Book b1 = new Book();
int authorAge = b1.Author.Age; // You never initialized the Author property.
// there is no Person to get an Age from.
}
}
않으려면 자식 (직업) nulll 참조에는 상위 (책) object& # 39 의 구성자를 초기화하십시오 수 있습니다.
초기화 네스트된 객체에는 동일하게 적용됩니다.
Book b1 = new Book { Author = { Age = 45 } };
이 있습니다
Book b1 = new Book();
b1.Author.Age = 45;
반면 '새' 키워드를 사용할 뿐 아니라 새 인스턴스를 만듭니다 '책', '사람' 이 아니라 '작가' 속성 때문에 새 인스턴스를 여전히 'null'.
public class Person {
public ICollection<Book> Books { get; set; }
}
public class Book {
public string Title { get; set; }
}
이 같은 초기화 네스트된 취합은 동작합니다.
Person p1 = new Person {
Books = {
new Book { Title = "Title1" },
new Book { Title = "Title2" },
}
};
이 있습니다
Person p1 = new Person();
p1.Books.Add(new Book { Title = "Title1" });
p1.Books.Add(new Book { Title = "Title2" });
'만' 사람 '이' 새로운 사람을 tcpg 인스턴스입니다 있지만 여전히 '책' 수집 'null'. 초기화 구문 취합은 컬렉션을 만들 수는 없습니다 '뿐 아니라' p1.Books.Add (.) '에 대한' p1.Books 구체화합니다 명령문입니다.
int[] numbers = null;
int n = numbers[0]; // numbers is null. There is no array to index.
Person[] people = new Person[5];
people[0].Age = 20 // people[0] is null. The array was allocated but not
// initialized. There is no Person to set the Age for.
long[][] array = new long[1][];
array[0][0] = 3; // is null because only the first dimension is yet initialized.
// Use array[0] = new long[2]; first.
Dictionary<string, int> agesForNames = null;
int age = agesForNames["Bob"]; // agesForNames is null.
// There is no Dictionary to perform the lookup.
public class Person {
public string Name { get; set; }
}
var people = new List<Person>();
people.Add(null);
var names = from p in people select p.Name;
string firstName = names.First(); // Exception is thrown here, but actually occurs
// on the line above. "p" is null because the
// first element we added to the list is null.
public class Demo
{
public event EventHandler StateChanged;
protected virtual void OnStateChanged(EventArgs e)
{
StateChanged(this, e); // Exception is thrown here
// if no event handlers have been attached
// to StateChanged event
}
}
동네 이름이 필드용 경우 다르게 할 수 있다는 걸 알고, 필드 초기화되었습니다 할 수 없다.
public class Form1 {
private Customer customer;
private void Form1_Load(object sender, EventArgs e) {
Customer customer = new Customer();
customer.Name = "John";
}
private void Button_Click(object sender, EventArgs e) {
MessageBox.Show(customer.Name);
}
}
이 규칙을 따라 접두어입니다 밑줄로 필드용 해결할 수 있다.
private Customer _customer;
public partial class Issues_Edit : System.Web.UI.Page
{
protected TestIssue myIssue;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
// Only called on first load, not when button clicked
myIssue = new TestIssue();
}
}
protected void SaveButton_Click(object sender, EventArgs e)
{
myIssue.Entry = "NullReferenceException here!";
}
}
Session 값을 # ASP.NET
// if the "FirstName" session value has not yet been set,
// then this line will throw a NullReferenceException
string firstName = Session["FirstName"].ToString();
ASP.NET MVC 의 경우 발생할 수 있는 '@Model idfsysobject. 참조할 때' 속성 '모델' 의 작업을 한다는 점을 이해하는 데 필요한 보기인 설정됨 방법, when you '반환' 보기입니다. 돌아왔을 때 빈 모델 (또는 모델 속성) 에서 보기를 제외한 액세스하면 컨트롤러이면 때 발생할 수 있다.
// Controller
public class Restaurant:Controller
{
public ActionResult Search()
{
return View(); // Forgot the provide a Model here.
}
}
// Razor view
@foreach (var restaurantSearch in Model.RestaurantSearch) // Throws.
{
}
<p>@Model.somePropertyName</p> <!-- Also throws -->
WPF 통제서 생성될지 니시알이제콤폰랑 '이 통화에서' 로 표시되는 순서대로 인텔®visual 진단트리 'A' 의 경우 누얼레페렌스엑스티온 높아질 것이라고 초기 생성되는가 이벤트 핸들러도 등, 그 동안 '와' 니시알이제콤폰랑 제어하는지 불지옥의 참조하는 만든 말 통제서. 예를 들면 다음과 같습니다.
<Grid>
<!-- Combobox declared first -->
<ComboBox Name="comboBox1"
Margin="10"
SelectedIndex="0"
SelectionChanged="comboBox1_SelectionChanged">
<ComboBoxItem Content="Item 1" />
<ComboBoxItem Content="Item 2" />
<ComboBoxItem Content="Item 3" />
</ComboBox>
<!-- Label declared later -->
<Label Name="label1"
Content="Label"
Margin="10" />
</Grid>
Here '는' label1 comboBox1 '이전에 작성한'. '만약' 참조 'label1 아직이라구요 생성되었습니까 comboBox1_SelectionChanged 시도_횟수 않을 것이다.
private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
label1.Content = comboBox1.SelectedIndex.ToString(); // NullReference here!!
}
Xaml 에 대한 선언을 순서 변경 (즉, 열거합니다 'label1' 전 'comboBox1' 무시하고 문제를 해결할 것이라고 누얼레페렌스엑스티온 디자인 철학인 '최소한' here.
var myThing = someObject as Thing;
그러나 이 doesn& 던질 때, t # 39 는 충족되었으며 베르발드카스티스세페시옹 되돌려줍니다 'null' 캐스트 실패 (섬로비치 자체가 언제 nulll). 알고 있으므로 iqn.
버전 1 () '와' 일반 '단일 ()' 가 있을 때 아무것도아니야 예외가 발생합니다. 이 " OrDefault"; 이 경우 nulll 반품해야 버전. 알고 있으므로 iqn.
'포리치' 할 때 던지는 반복할 수 nulll 뜻한다. 일반적으로 'null' 로 인해 예상치 못한 인한 반품해야 메서드입니다 컬렉션.
List<int> list = null;
foreach(var v in list) { } // exception
Select 노드입니다 보다 현실적인 예를 통해 XML 문서입니다. 그러나 모든 것을 알 수 없는 경우 초기 디버깅하지 유효함 특성는 노드입니다 던질 것이다.
foreach (var node in myData.MyXml.DocumentNode.SelectNodes("//Data"))
이 경우 작성되지는 참조입니다 널일 수 있다 'null' 전 멤버 액세스을 인스턴스입니다 기술입니까 확인할 수 있습니다.
void PrintName(Person p) {
if (p != null) {
Console.WriteLine(p.Name);
}
}
예상한 호출하십시오 반환되기를 반환할 수 있는 방법, 예를 들어 'null' 인스턴스입니다 기술입니까 객체에는 방안을 찾을 수 없습니다. 한 때 이 경우. 기본값입니다 반환되기를 선택할 수 있습니다.
string GetCategory(Book b) {
if (b == null)
return "Unknown";
return b.Category;
}
사용자 정의 idfsysobject. 던질 수도 있습니다 만 잡을 수 있는 it 호출하십시오 코드:
string GetCategory(string bookTitle) {
var book = library.FindBook(bookTitle); // This may return null
if (book == null)
throw new BookNotFoundException(bookTitle); // Your custom exception
return book.Category;
}
그러나 결코 할 수 있는 방법을 알고 있을 때, 아마 개발 기간 동안 사용할 수 있습니다 () '' null ',' 데버g. 아서르트 복귀하십시오 분할하려면 해야한단말입니다 않니다 때 발생합니다.
string GetTitle(int knownBookID) {
// You know this should never return null.
var book = library.GetBook(knownBookID);
// Exception will occur on the next line instead of at the end of this method.
Debug.Assert(book != null, "Library didn't return a book for known book ID.");
// Some other code
return book.Title; // Will never throw NullReferenceException in Debug mode.
}
비록 이 확인란 [않을 수 있는 릴리스에는 다니엘을 구축하십시오] (https://stackoverflow.com/questions/3021538/debug-assert-appears-in-release-mode), 이로 인해 '책' 에 '같이' 누얼레페렌스엑스티온 redhat. 때 다시 런타임용으로 개발하십시오 = null 에 릴리스에는 모드.
DateTime? appointment = null;
Console.WriteLine(appointment.GetValueOrDefault(DateTime.Now));
// Will display the default value provided (DateTime.Now), because appointment is null.
appointment = new DateTime(2022, 10, 20);
Console.WriteLine(appointment.GetValueOrDefault(DateTime.Now));
// Will display the appointment date, not the default
이 때 기본값입니다 대표 제공하는 데 'null' 발견되는:
IService CreateService(ILogger log, Int32? frobPowerLevel)
{
var serviceImpl = new MyService(log ?? NullLog.Instance);
// Note that the above "GetValueOrDefault()" can also be rewritten to use
// the coalesce operator:
serviceImpl.FrobPowerLevel = frobPowerLevel ?? 5;
}
이 역시 안전한 탐색 또는 엘비스 (그 후 형태) 라고도 하는 모습이다. 왼쪽에 있는 경우 표현식에서는 연산자에서 널임 오른쪽면 않을 경우, 평가 및 nulll 반환됨 한다. 즉, 다음과 같은 경우
var title = person.Title.ToUpper();
이 사람이 만약 제목이 없는, 이렇게 하면 '등록 정보' 를 하고 있기 때문에 예외가 호출하십시오 토퍼 null 값을 가진. 아래의 C # 에서 5 와 함께 지키는 수 있습니다.
var title = person.Title == null ? null : person.Title.ToUpper();
이제 직무명 가변으로 예외를 던지는 대신 널일 했다. C # 6 cxp 짧은 구문을 다음과 같습니다.
var title = person.Title?.ToUpper();
이렇게 되면 'null', '아니다' 를 호출하는 것을 직무명 가변으로 토퍼 브라운아저씨의 페르송스티리 경우 '는' 및 'null'. 물론 확인할 수 있는 '제목' 을 사용하여 null null 또는 너회가 still 작동자 찼음을 함께 공급할 기본값입니다 nulll 병합합니다 작동자 ('??').
// regular null check
int titleLength = 0;
if (title != null)
titleLength = title.Length; // If title is null, this would throw NullReferenceException
// combining the `?` and the `??` operator
int titleLength = title?.Length ?? 0;
[I] ',' 어레이에는 거짓하였으니 대해 다음과 같이 사용할 수 있습니다.
int[] myIntArray=null;
var i=5;
int? elem = myIntArray?[i];
if (!elem.HasValue) Console.WriteLine("No value");
이렇게 하면 다음과 같이 하십시오. 만약 미안타이 널임, 표현식에서는 nulll 되돌려줍니다 확인해 안전하게 할 수 있습니다. 이 같은 어레이에서는 포함되어 있으면 할 수 있다. [i] '와' 요소 = 미안타이 i< 되돌려줍니다 sup> th< /sup>;;;; 요소.
C #, # 39 에서 소개된 8 좁히어 nulll context& srdf/s 및 누얼바이 참조 유형을 정적 분석 변수에 대한 경고 및 는 수행할 수 있는 경우 또는 null null 로 설정되었습니다 컴파일러와의 가치를 창출할 수 있습니다. 이 누얼바이 참조 유형을 추상형데이터타입 스크램블된 명시적으로 널일 수 있습니다. 이 사업에 대해 경고 및 주석 컨텍스트로 누얼바이 누얼바이 컨텍스트로 누얼바이 요소점 in your 치프로이 사용하여 파일을 설정할 수 있습니다. 이 유형의 누야빌레티 컴파일러 구성 요소를 어떻게 해석하는 것이 무엇인지 개의경고 생성됩니다. 유효한 설정은 다음과 같습니다.
C # 은 " 반복자가 blocks"; (일명 " generators"; 일부 인기 있는 다른 언어). 특히 까다로운 nulll 역참조 할 수 있는 예외 디버그로 반복자가 블록 슬픔으로창백해지고 우회된 실행:
public IEnumerable<Frob> GetFrobs(FrobFactory f, int count)
{
for (int i = 0; i < count; ++i)
yield return f.MakeFrob();
}
...
FrobFactory factory = whatever;
IEnumerable<Frobs> frobs = GetFrobs();
...
foreach(Frob frob in frobs) { ... }
'어떤' 결과 '가' null '다음' 마크프로브 경우 던진다. 이제 할 일은 이 생각하는 올바른 일을 할 수 있습니다.
// DON'T DO THIS
public IEnumerable<Frob> GetFrobs(FrobFactory f, int count)
{
if (f == null)
throw new ArgumentNullException("f", "factory must not be null");
for (int i = 0; i < count; ++i)
yield return f.MakeFrob();
}
그 이유는 잘못된 것일까? '포리치 때문에 실제로 반복자가 블록 언약보다는 실행하십시오 때까지'! 가 있는 경우 단순히 '를 호출하는 제프로브스' 을 반환하는지 객체에는 이터레이션된 반복자가 실행하십시오 블록. Null null 역참조 확인란 써서 이런 것을 방지할 수 있습니다, 하지만 당신은 움직이십시오 nulll 인수 예외가 아닌 호츨 이터레이션에 점에 점을, 이는 매우 혼란스러운 디버그로 . 올바른 수리입니다 입니다.
// DO THIS
public IEnumerable<Frob> GetFrobs(FrobFactory f, int count)
{
// No yields in a public method that throws!
if (f == null)
throw new ArgumentNullException("f", "factory must not be null");
return GetFrobsForReal(f, count);
}
private IEnumerable<Frob> GetFrobsForReal(FrobFactory f, int count)
{
// Yields in a private method
Debug.Assert(f != null);
for (int i = 0; i < count; ++i)
yield return f.MakeFrob();
}
즉, 어떤 방식으로 할 수 있는 전용 반복자가 블록 로직, 공용 서피스를 산아래의 nulll 있는 방법을 확인하고 되돌려줍니다 반복자가. 이제 '때', ',' 체크 후 즉시 제프로브스 호출됨 널 때 무슨 일이 있어도 제프로브스포릴 실행하므로 e0100042.log 이터레이션된 있다. 이 기술은 개체에 대한 참조를 검토할 경우 소스임을 LINQ 전반에 걸쳐 사용되는 것을 확인할 수 있습니다. 어설픈 것이 조금 더 쓸 수 있지만 디버깅하지 무효 오류뿐만 훨씬 간편해집니다. 최적화합니다 편의를 위한 것일 뿐 아니라 콜러 코드만이 작성자 .
C # 은 " unsafe"; 이는 매우 위험한 정상적인 안전 모드, 이름이 의미하듯이 때문에 메모리 타입 안전 안전 및 메커니즘을 제공하는 은 적용되지 않습니다. 안됩니다 먹어서나 안전하지 않은 코드를 어떻게 철저하고 대한 전문적인 지식이 없을 경우 메모리 작동됨 . 안전하지 않은 모드) 의 두 가지 중요한 사실을 알고 있어야 합니다.
두 번째 점을 어때? 데레페렌츠링) 에 속하는 모든 잘못된 포인터입니다 최저값 페이지에 오류가 있으며 그에 따라, 가상 메모리 같은 운영체제 (os) 가 같은 예외가 아니다. 왜 이해가 가니? 뭐, 예를 들어, 우리는 두 개의 정수 및 오버클로킹된 비관리 null 포인터를 포함하는 구조체입니다 같습니다. 만약 우리가 역참조 할 두 번째 int 의 구조체입니다, CLR 시도하지 않습니다 스트로지 액세스하려면 위치에서 제로. 또 스토리지 액세스하십시오 위치에서 4. 하지만 이는 nulll 역참조 논리적으로 생길 수 있기 때문에 통해 해결할 수 있는 널. 안전하지 않은 코드를 사용하는 경우, 그냥 널 포인터 역참조 idfsysobject. 및 확보하십시오 잘못된 점을 유념하십시오 널일 필요가 없습니다. 그리고 이 모든 위치에서 최저값 페이지이므로 idfsysobject. 생성될 수 있다.
메시지 " 설정되지 않은, 개체, 시도할 고말은 Object" 인스턴스입니다 개체를 사용하여 않은 초기화되었습니다. 이 문제는 down to one of these.
문제는 한 이후, 그 해답은 개체 참조입니다 원하는거요 'Nothing' 등을 알아보기 위해 어느쪽이야. 그럼 왜 결정하는 것은 초기화되었습니다. 마우스를 잡고 다양한 변수 값을 및 Visual Studio (VS) 가 될 것이다 '-' 아무것도아니야 범인을 보여줘야 한다. ! IDE 디버그입니다 박람회 또한 합니다 / Catch 블록 떨어진 곳에, 특히 시도하시겠습니까 분리하십시오 관련 코드를 수준들과 Catch 블록 것이 없습니다. 이로 인해 코드에 객체를 사용하려고 할 때 작동이 중단될 수 있는 'Nothing'. 정확한 위치를 파악할 수 있기 때문에 이는 그리웠댔지 있으며, 이로 인해 이 문제에 대한 객체에는 식별할 수 있습니다. '잘' 한 '에 오류가 발생했습니다.' 을 표시하는 마스크보스 도움이 되지 못했다. 또한 이 방법은 아주 나쁜 , Stack& 빨리 이어진다. # 39 설명할 수 있기 때문에, 실제 idfsysobject. can& 오버플로입니다 질문, t, 심지어 객체에는 코드 위치에 선 관련된 일이 발생한다. '창' ( 디버그입니다 - >, 동네 사용할 수도 있습니다 Windows - >. 지역 주민들은 ) 를 검토하여 객체에는. 일단 문제가 무엇인지, 어디서, 대개는 새로운 질문이예요 올려 상당히 쉽게 해결할 수 있도록 하고 빠릅니다. 참고:
<! - 모든 언어: > vb 랭 -;
Dim reg As CashRegister
...
TextBox1.Text = reg.Amount ' NRE
문제는 '흐림' , 객체에는 캐시지스터 만들지 않습니다 해당 유형의 'reg' 이라는 변수에 선언합니다 뿐입니다. 는 서로 다른 두 변수 선언 및 객체를 생성하는 인스턴스입니다 전지전능하심이라
Dim reg As New CashRegister ' [New] creates instance, invokes the constructor
' Longer, more explicit form:
Dim reg As CashRegister = New CashRegister
나중에 인스턴스를 만드는 데 필요한 때 뿐이다.
Private reg As CashRegister ' Declare
...
reg = New CashRegister() ' Create instance
참고: 사용하지 않는 등 '흐림' 다시 절차를 구성자를 ('새' 서브노드):
Private reg As CashRegister
'...
Public Sub New()
'...
Dim reg As New CashRegister
End Sub
, 해당 지역 변수를 만들 수 있는 'reg' 이 있을 뿐 해당 컨텍스트로 (부분). '이' 레벨 '유효범위 사용하려는 다른 모든 모듈을 내장한 가변적입니다 reg' 여전히 'Nothing'. >. 놓치고 있는 '새' 는 '예외' 원인 중 하나로 볼 수 있는 # 1 연산자입니다 누얼리퍼런스 Stack& nbsp;; 오버플로입니다 질문을합니다 검토됨. >. 비주얼 베이직 '새' 를 사용하여 프로세스를 만들 것을 거듭 선택해제합니다 : Operator 는 사용하여 '새' '-' - 이 새로운 서브노드 페이징됩니다 새로운 객체 및 기타 초기화하지 어디에 객체에는 구성자를 수행할 수 있습니다. '흐림' (또는 '개인') 명확히 변수 및 해당 '유형' 만 하다. - 유효범위 이 전체 존재 또는 변수의 인스턴스인지 모듈에서는 절차에 대해 로컬임 / class 는 검은선을 여기서 - 것은 없다. 보면안돼 친구 '있다' 고 eventtest 액세스 단위로레벨에서 유효범위 없습니다. 자세한 내용은:
어레이에는 인스턴스화되지 있어야 합니다.
Private arr as String()
이 어레이에는 전용) 를 선언한 만들지 않는 것으로 나타났다. 어레이에서는 초기화하지 방법에는 여러 가지가 있습니다.
Private arr as String() = New String(10){}
' or
Private arr() As String = New String(10){}
' For a local array (in a procedure) and using 'Option Infer':
Dim arr = New String(10) {}
참고: Vs 2010년 로 시작하는 '이라 이름 변경 및' 옵션을 사용하여 로컬 어레이입니다 일러주라하셨으니 초기화중 ipv6-literal. < Type>, '와' 새 ',' 으로 요소는 선택적입니다:
Dim myDbl As Double() = {1.5, 2, 9.9, 18, 3.14}
Dim myDbl = New Double() {1.5, 2, 9.9, 18, 3.14}
Dim myDbl() = {1.5, 2, 9.9, 18, 3.14}
크기는 데이터를 데이터 유형 및 어레이입니다 지정받습니다 추론할 수 있다. Class/Module 수준 선언 '을 (를)', '으로, 여전히 필요한 < type> 옵션을 엄격한':
Private myDoubles As Double() = {1.5, 2, 9.9, 18, 3.14}
Dim arrFoo(5) As Foo
For i As Integer = 0 To arrFoo.Count - 1
arrFoo(i).Bar = i * 10 ' Exception
Next
이 어레이에는 작성되었지만 Foo '이' 항목이없습니다 객체에는 않았습니다.
For i As Integer = 0 To arrFoo.Count - 1
arrFoo(i) = New Foo() ' Create Foo instance
arrFoo(i).Bar = i * 10
Next
'목록 (T) 를 사용하여' 하면 유효한 객체를 가지고 요소 없이 상당히 어렵다.
Dim FooList As New List(Of Foo) ' List created, but it is empty
Dim f As Foo ' Temporary variable for the loop
For i As Integer = 0 To 5
f = New Foo() ' Foo instance created
f.Bar = i * 10
FooList.Add(f) ' Foo object added to list
Next
자세한 내용은:
.NET 집단 (- 여러 가지 종류가 있으며, 사전, 열거합니다 등) 또는 창조하 인스턴스화되지 있어야 합니다.
Private myList As List(Of String)
..
myList.Add("ziggy") ' NullReference
같은 이유로 '-' 같은 idfsysobject. 확보하십시오 미리스트 있지 않지만, 인스턴스입니다 창조하 불과했다 "고 밝혔다. Remedy 동일합니다.
myList = New List(Of String)
' Or create an instance when declared:
Private myList As New List(Of String)
컬렉션 '유형' 는 클래스 사용하는 일반적인 감독:
Public Class Foo
Private barList As List(Of Bar)
Friend Function BarCount As Integer
Return barList.Count
End Function
Friend Sub AddItem(newBar As Bar)
If barList.Contains(newBar) = False Then
barList.Add(newBar)
End If
End Function
절차 때문에 발생합니다 '만' 는 바리스트 인컨텍스트 (nre) 를 선언한 것은 인스턴스화됩니다. Foo '인스턴스입니다 만들기' '내부' 바리스트 인스턴스입니다 생성할 수 없습니다. 이 중 구성자를 intent to do it 수 있었을 것이다.
Public Sub New ' Constructor
' Stuff to do when a new Foo is created...
barList = New List(Of Bar)
End Sub
전과 같이 이는 틀린 말이다.
Public Sub New()
' Creates another barList local to this procedure
Dim barList As New List(Of Bar)
End Sub
데이터베이스 작업 때문에 많은 기회를 나타내줍니다 누얼리퍼런스 많은 천체가 있을 수 있습니다 ('명령', '연결', '거래', '데이터세트를', '데이터 테이블', '다타로스'). 현재 사용 중인 한 번. Note: 데이터 공급자를 사용하지 않기 때문에 어떤 일이 사용하고 MySQL, SQL Server, 이 개념을 올레드브 등 - - 같습니다.
Dim da As OleDbDataAdapter
Dim ds As DataSet
Dim MaxRows As Integer
con.Open()
Dim sql = "SELECT * FROM tblfoobar_List"
da = New OleDbDataAdapter(sql, con)
da.Fill(ds, "foobar")
con.Close()
MaxRows = ds.Tables("foobar").Rows.Count ' Error
'Ds' 를 선언한 것은 있지만, 이전처럼 데이터세트를 객체에는 인스턴스를 만들 수 없었다. 기존 '아닌' '이' 다테이섬프터 채우는 데이터세트를 생성하시겠습니까. 이 경우, 'ds' 는 경고합니다 , 있는 IDE 로컬 변수 때문에 이런 현상이 발생할 수 있습니다. img! / Class 레벨 변수를 선언할 때 모듈로 사례와 같이 '콘' 것으로, 컴파일러, t) 에 의해 만들어진 업스트림입니다 다운로드되었는지 객체에는 can& # 39 라는 뜻이다. 개의경고 무시하시겠습니까 마십시오.
Dim ds As New DataSet
ds = New DataSet
da = New OleDBDataAdapter(sql, con)
da.Fill(ds, "Employees")
txtID.Text = ds.Tables("Employee").Rows(0).Item(1)
txtID.Name = ds.Tables("Employee").Rows(0).Item(2)
오식 한 문제가 있습니다. '명' vs '부하예요'. 데이터 테이블 ',' 라는 Employee" " 없었다. 이 때문에 '결과' 누얼레페렌스엑스티온 창조하 액세스하려는. 또 다른 잠재적 문제가 있을 수 없는 아이템 '가정' SQL where 절 외면하였나니 수 있습니다.
If ds.Tables(0).Rows.Count > 0 Then
txtID.Text = ds.Tables(0).Rows(0).Item(1)
txtID.Name = ds.Tables(0).Rows(0).Item(2)
End If
'칠 수 있는 기능을 할 수 있다' 는 '반환' 행뿐만 영향을 받은 테스트됨:
If da.Fill(ds, "Employees") > 0 Then...
Dim da As New OleDb.OleDbDataAdapter("SELECT TICKET.TICKET_NO,
TICKET.CUSTOMER_ID, ... FROM TICKET_RESERVATION AS TICKET INNER JOIN
FLIGHT_DETAILS AS FLIGHT ... WHERE [TICKET.TICKET_NO]= ...", con)
Dim ds As New DataSet
da.Fill(ds)
If ds.Tables("TICKET_RESERVATION").Rows.Count > 0 Then
다테이섬프터 '은' 이 '와 같이 이전 예제에서와 타바레나미스 것은 아니지만' 에서 이름을 SQL 구문 또는 데이터베이스 테이블. 그 결과, '제이타바레스 (TICKET_RESERVATION" ";)' 참조입니다 존재하지 않는 표. , 는 이를 통해 이 같은 참조 테이블 색인:
If ds.Tables(0).Rows.Count > 0 Then
If myFoo.Bar.Items IsNot Nothing Then
...
이 코드는 달리하 '아이템' 모두 '동시에' '와' 표시줄에는 마이포 아무말도요 수도 있습니다 는 전체 또는 체인을 객체에는 테스트하려면 이 길을 한 번에 해결할 수 있습니다.
If (myFoo IsNot Nothing) AndAlso
(myFoo.Bar IsNot Nothing) AndAlso
(myFoo.Bar.Items IsNot Nothing) Then
....
그리고 또한 '' 중요하다. 첫 번째 '거짓' 후속 테스트를 한 번씩 수행됨 않을 경우는 발생했습니다. # 39, & # 39 drill& 코드를 안전하게 있습니다. # 39, & # 39 한 level& 꽂으십시오 객체에는). 한 번에 마이포그바 '평가' (아웃하기로) '' 판별됩니다 마이포 후에만 유효합니다. 한 때 꽤 복잡한 코딩 객체에는 패스이므로 체인이나 객체에는 얻을 수 있다.
myBase.myNodes(3).Layer.SubLayer.Foo.Files.Add("somefilename")
myWebBrowser.Document.GetElementById("formfld1").InnerText = "some value"
Dim cmd5 As New SqlCommand("select Cartons, Pieces, Foobar " _
& "FROM Invoice where invoice_no = '" & _
Me.ComboBox5.SelectedItem.ToString.Trim & "' And category = '" & _
Me.ListBox1.SelectedItem.ToString.Trim & "' And item_name = '" & _
Me.ComboBox2.SelectedValue.ToString.Trim & "' And expiry_date = '" & _
Me.expiry.Text & "'", con)
이 코드는 다른 것들 중 한 명 이상의 사용자가 선택한 것으로 기대하지 않는다고 UI 컨트롤 할 수 없습니다. '잘' 수 'Nothing', '너무' 5월 ListBox1.SelectedItem ListBox1.SelectedItem.ToString NRE 발생합니다.
Dim expiry As DateTime ' for text date validation
If (ComboBox5.SelectedItems.Count > 0) AndAlso
(ListBox1.SelectedItems.Count > 0) AndAlso
(ComboBox2.SelectedItems.Count > 0) AndAlso
(DateTime.TryParse(expiry.Text, expiry) Then
'... do stuff
Else
MessageBox.Show(...error message...)
End If
Public Class Form1
Private NameBoxes = New TextBox(5) {Controls("TextBox1"), _
Controls("TextBox2"), Controls("TextBox3"), _
Controls("TextBox4"), Controls("TextBox5"), _
Controls("TextBox6")}
' same thing in a different format:
Private boxList As New List(Of TextBox) From {TextBox1, TextBox2, TextBox3 ...}
' Immediate NRE:
Private somevar As String = Me.Controls("TextBox1").Text
이 방법은 꽤 흔한 충족되었으며 NRE. C # 의 방식에 따라 코딩, IDE 는 보고서에서 '제어' 가 없습니다 수 없으며, 현재 컨텍스트로 또는 " 비정적 member" 참조. 따라서, 이 기술은 어느 정도 vb 국한됨 것이다. 또한 복잡한 장애가 발생할 수 있기 때문에 케스케이드.
Sub Form_Load(..._
'...
Dim name As String = NameBoxes(2).Text ' NRE
' ...
' More code (which will likely not be executed)
' ...
End Sub
Public Class Form1
Private myFiles() As String = Me.OpenFileDialog1.FileName & ...
Private dbcon As String = OpenFileDialog1.FileName & ";Jet Oledb..."
Private studentName As String = TextBox13.Text
' Module level declaration
Private NameBoxes as TextBox()
Private studentName As String
' Form Load, Form Shown or Sub New:
'
' Using the OP's approach (illegal using OPTION STRICT)
NameBoxes = New TextBox() {Me.Controls("TextBox1"), Me.Controls("TestBox2"), ...)
studentName = TextBox32.Text ' For simple control references
아직 이 어레이에는 코드를 숲 밖으로 나가지 않을 수 있습니다. 있는 모든 제어하는지 컨테이너입니다 제어 (like a '그룹 상자' 또는 '패널') 가 마이콩트로우스 ',' 에서 찾을 수 없습니다. 받을 수 있는 통제서 취합은 iqn 패널 또는 그룹 상자. Disk_b_s10database 제어점 때 맞춤법이 틀린 것이라고 귀의하지않는다고 제어입니다 이름님은 ('" TeStBox2";'). 이런 경우, 그 결과 및 오버클로킹된 NRE 는 어레이입니다 요소 '가 다시' 아무것도아니야 저장해야 할 때 참조입니다 거잖나. 지금 알고 있는 찾고자 하는 이러한 쉽게 찾을 수 있어야 합니다. VS 오류가 있습니다 네 가지 방법! " Button2"; 패널 '을) 에 있는'
' Declaration
Private NameBoxes As TextBox()
' Initialization - simple and easy to read, hard to botch:
NameBoxes = New TextBox() {TextBox1, TextBox2, ...)
' Initialize a List
NamesList = New List(Of TextBox)({TextBox1, TextBox2, TextBox3...})
' or
NamesList = New List(Of TextBox)
NamesList.AddRange({TextBox1, TextBox2, TextBox3...})
Private bars As New List(Of Bars) ' Declared and created
Public Function BarList() As List(Of Bars)
bars.Clear
If someCondition Then
For n As Integer = 0 to someValue
bars.Add(GetBar(n))
Next n
Else
Exit Function
End If
Return bars
End Function
이 경우는 IDE 는 & # 39 알리는 것은 누얼레페렌스엑스티온 result , * 와 # 39 ',' 모든 경로를 값을 반환할 수 있다. '경고' 을 (를) '기능을 대체하여 억제할 수 있습니다, 종료하십시오 복귀하십시오 아무것도아니야' 있으나, 그 문제를 해결하지 못했습니다. 아무 것도 할 때 사용할 수 있는 '= False' 복귀하십시오 섬콘딧리온 NRE 발생합니다.
bList = myFoo.BarList()
For Each b As Bar in bList ' EXCEPTION
...
bList = myFoo.BarList()
If bList IsNot Nothing Then...
A / Catch 시도하시겠습니까 숨길 수 있는 새로운 문제가 있으며 이로 인해 심하게 구현됩니까 수준들과:
Dim dr As SqlDataReader
Try
Dim lnk As LinkButton = TryCast(sender, LinkButton)
Dim gr As GridViewRow = DirectCast(lnk.NamingContainer, GridViewRow)
Dim eid As String = GridView1.DataKeys(gr.RowIndex).Value.ToString()
ViewState("username") = eid
sqlQry = "select FirstName, Surname, DepartmentName, ExtensionName, jobTitle,
Pager, mailaddress, from employees1 where username='" & eid & "'"
If connection.State <> ConnectionState.Open Then
connection.Open()
End If
command = New SqlCommand(sqlQry, connection)
'More code fooing and barring
dr = command.ExecuteReader()
If dr.Read() Then
lblFirstName.Text = Convert.ToString(dr("FirstName"))
...
End If
mpe.Show()
Catch
Finally
command.Dispose()
dr.Close() ' <-- NRE
connection.Close()
End Try
이 사건은 물론 엇회전식 객체의 예상대로 생성되지 않은 것이 '빈' 잘 보여준다. There is an (vora # 39, & # 39, mailaddress&) SQL 에서 추가 쉼표 이로 인해 그렉세쿠테레이더 예외가 dell. ''. 마지막으로 ',' 이후 '에서' 잘 수행할 수 있지만, 아무 것도 할 수 없으므로 '' null '클린업합니다 닫으십시오 데이트라이더 객체, 브랜드' 새 '누얼레페렌스엑스티온' 결과를 얻을 수 있습니다.
For Each row As DataGridViewRow In dgvPlanning.Rows
If Not IsDBNull(row.Cells(0).Value) Then
...
If row.Cells(0) IsNot Nothing Then ...
전과 같이 특정 값을 어졌다면 문이뇨 테스트할 수 있습니다.
If (row.Cells(0) IsNot Nothing) AndAlso (IsDBNull(row.Cells(0).Value) = False) Then
Dim getFoo = (From f In dbContext.FooBars
Where f.something = something
Select f).FirstOrDefault
If Not IsDBNull(getFoo) Then
If IsDBNull(getFoo.user_id) Then
txtFirst.Text = getFoo.first_name
Else
...
'처음' 퍼스트러더포트 되돌려줍니다 항목인지 기본값입니다, 이는 '절대' '를 참조 유형을 아무것도아니야 데브누얼':
If getFoo IsNot Nothing Then...
Dim chk As CheckBox
chk = CType(Me.Controls(chkName), CheckBox)
If chk.Checked Then
Return chk
End If
If (chk IsNot Nothing) AndAlso (chk.Checked) Then ...
이 지프 몇 쿼크 주기적으로 볼 수 있다.
dgvBooks.DataSource = loan.Books
dgvBooks.Columns("ISBN").Visible = True ' NullReferenceException
dgvBooks.Columns("Title").DefaultCellStyle.Format = "C"
dgvBooks.Columns("Author").DefaultCellStyle.Format = "C"
dgvBooks.Columns("Price").DefaultCellStyle.Format = "C"
'진정한', '=' 의 경우 지프부크스 오토의테콜럼너스 것은 아니지만, 열을 생깁니다 그들을 도왔으매 위의 코드는 장애가 발생한 경우 이를 참조하는 것이 의해 이름 지어졌다.
dgvBooks.Columns(0).Visible = True
xlWorkSheet = xlWorkBook.Sheets("sheet1")
For i = 0 To myDGV.RowCount - 1
For j = 0 To myDGV.ColumnCount - 1
For k As Integer = 1 To myDGV.Columns.Count
xlWorkSheet.Cells(1, k) = myDGV.Columns(k - 1).HeaderText
xlWorkSheet.Cells(i + 2, j + 1) = myDGV(j, i).Value.ToString()
Next
Next
Next
'다타그리드비에프' 의 경우 '알로우스트로이드로스' 도 'True' (기본값) '를' 셀 'Nothing' 모두가 새로운 행일 공백일 / 맨 아래에 있습니다. 대부분의 시도_횟수 콘텐츠를 이용할 수 있도록 (예를 들어, 'ToString') NRE 발생합니다.
For Each r As DataGridViewRow in myDGV.Rows
If r.IsNewRow = False Then
' ok to use this row
특정 상황에서는 미이스팅스 '가' 항목을 사용하려는 "에서 처음 사용할 때 누얼리퍼런스 스트라이코 알렉시옹 '이 생길 수 있습니다. 이 솔루션은 같지만 아닌 명백하네. 고려해야 합니다.
My.Settings.FooBars.Add("ziggy") ' foobars is a string collection
Vb 는 설정 이후 관리하는 것이 타당하다고 당신꺼에요 취합은 초기화하지 것으로 예상하고 있습니다. 단, 이전에 추가된 것이라고 경우 초기 엔트리급에서 컬렉션 (flash. 설정 편집기). 이후 컬렉션은 (것) 초기화되었습니다 항목이 추가된 항목을 설정 '있다' 아무 것도 없을 때 편집기에는 추가합니다.
If My.Settings.FooBars Is Nothing Then
My.Settings.FooBars = New System.Collections.Specialized.StringCollection
End If
아마 지은 '새' 작동자. 또는 당신이 원하는 대로 설정하여 자유롭게 수행할 수 있는 것으로 아니하였으매 반환되기를 초기화되었습니다 객체에는 코드에 않았다.
다른 시나리오는 캐스트 때 null 객체에는 붙여넣습니다 값 유형. 예를 들어, 코드 (아래 참조).
object o = null;
DateTime d = (DateTime)o;
'A' 의 누얼레페렌스엑스티온 던질 예정이다 "라고 언급했다. 이 일이 일어날 수 있지만, 더 크게 보인다 명백하네 위 예제 " late-binding"; # 39 에서 복잡한 시나리오가 널 객체에는 가 반환되었는지 일부 코드를 너회가 don&, t 는 예를 들어, 소유 및 일부 캐스트 의해 생성된 자동 시스템.
예를 들어 있는 부분 (ASP.NET) 이 로만스였나 단순해졌습니다 바인딩하면 캘리저 제어입니다:
<asp:Calendar runat="server" SelectedDate="<%#Bind("Something")%>" />
여기서 '-' 의 '사실' 셀레스테드라테 속성 유형 중 '-' 웹 컨트롤 유형, DateTime 스케줄표의 바인딩하면 복귀하십시오 nulll 완벽하게 할 수 있다. (ASP.NET) 를 만들 수 있는 코드를 암시적입니다 발생기입니다 캐스트 코드 위에 해당합니다. 즉, 이 부활시켜 누얼레페렌스엑스티온 'a' (ASP.NET) 에서 생성된 코드 컴파일됩니다 좋았소 거짓한 별색 때문에 상당히 어렵다
즉, 변수를 질문은 abc. dell. 아무것도아니야. 이 같은 발령합니다 어떻게 할 수 있습니다.
SqlConnection connection = null;
connection.Open();
이를 방지하기 위해 오류:
해당 객체의 참조를 사용하여 null 로 설정되었습니다 무슨뜻이냐믄 코드에서 변수 (즉, 실제 객체에는 인스턴스입니다 되지 않아 참조).
이 오류를 방지하기 위한 전에 해야 할 수 있는 객체에는 널일 테스트되었습니다 nulll 사용됩니다.
if (myvar != null)
{
// Go ahead and use myvar
myvar.property = ...
}
else
{
// Whoops! myvar is null and cannot be used without first
// assigning it to an instance reference
// Attempting to use myvar here will result in NullReferenceException
}
그 원인은 관계없이 항상 같은 점을 유념하십시오 슬라이드에서는 .NET 에서는:
>. 틀렸다니까 사용하려는 가변적입니다 참조입니다 값이 'Nothing' / 'null'. 값이 'Nothing' / 'null' 를 개최하는 것은 가변적입니다 참조입니다 즉, 실제로 존재하는 모든 객체에 대한 참조가 인스턴스입니다 힙.
>. 절대, 절대 생성되는가 인스턴스입니다 뭔가 지정받습니다 너회가 인컨텍스트 변수에 대한 대입된 값이 같을 수 없다 '는 변수, 너 변수를 설정할 수 있습니다' / 'null' 또는 '라는 변수를 설정하는 기능을 수동으로 아무것도아니야' / 'null' 당신꺼에요.
예를 들어 idfsysobject. 기술입니까 발생하고 있다. 뭔가 할 때 확인할 수 있는 널임.
예를 들면 다음과 같습니다.
string testString = null; //Because it doesn't have a value (i.e. it's null; "Length" cannot do what it needs to do)
if (testString.Length == 0) // Throws a nullreferenceexception
{
//Do something
}
A 는 닷넷 (.net) 기반 런타임용으로 개발하십시오 누얼레페렌스엑스티온 hasn& 뭔가 작업을 수행할 수 있는 것을 시도할 때, 즉 t # 39 위 코드를 인스턴스화되지 왔다.
반면 충족되었으며 아르구망누 알렉세페시옹 버린 경우 대개 비호환성의 수비 주옵니다 메서드입니다 중인 is not null 전달된 것으로 기대하고 있다.
자세한 정보는 in C # 누얼레페렌스엑스티온 및 nulll 매개변수입니다 .
C # 업데이트하십시오 v8.0, 2019년: 누얼바이 참조 유형을
본 적이 없는 경우 초기화되었습니다 참조입니다 유형, you want to a , 세트이거나 자조도 속성을 누얼레페렌스엑스티온 던질 것으로 보인다.
예:
Person p = null;
p.Name = "Harry"; // NullReferenceException occurs here.
단순히 여부를 확인하여 가변입니다 not null 이 문제를 방지할 수 있습니다.
Person p = null;
if (p!=null)
{
p.Name = "Harry"; // Not going to run to this point
}
이유를 이해하기 위해 누얼레페렌스엑스티온 발생하며, 사이의 차이를 아는 것이 중요합니다 value 유형은상위 와 [참조 유형을] [3].
따라서 you& 값을 # 39, re 다루는 것은 추상형데이터타입 누얼레페렌스엑스티언스 발생할 수 있습니다. ! 참조 유형을 유지하는 데 필요한 경우에도 다룰 때 경고
이 이름은 말 그대로 수용할 수 있어 참조입니다 또는 점 때문에 참조만 유형은상위 시사하는 것 (또는 & # 39, null& # 39;). 반면 추상형데이터타입 값이 항상 값을 포함할.
무슨 일이 일어날 수 있다 '는' 사례를 누얼레페렌스엑스티언스 사용하는 (잘못된) '도' 운영자:
class Book {
public string Name { get; set; }
}
class Car { }
Car mycar = new Car();
Book mybook = mycar as Book; // Incompatible conversion --> mybook = null
Console.WriteLine(mybook.Name); // NullReferenceException
여기서 '책' 와 '자동차' 서로 호환되지 않는 유형. a '자동차' 로 변환할 수 없는 / 캐스팅 '책'. 이 때 되돌려줍니다 캐스팅 실패 '로' 'null'. 이 경우 '누얼레페렌스엑스티온 미부크 사용하여' '후'.
일반적으로 다음과 같이 콩지름에 다우트 '또는' 으로
유형 변환 검색되어야 항상 성공할 경우 (예: 객체에는 미리 알아야 한다고) 한 후, 콩지름에 cast.
ComicBook cb = (ComicBook)specificBook;
ComicBook cb = specificBook as ComicBook;
if (cb != null) {
// ...
}
사용하고 있는 객체에는 null 값을 참조입니다. 그래서 it& 확증하노라 # 39 의 null 예외가 아니다. 예를 들어, 문자열 값이 null 과 확인할 때 그 길이, idfsysobject. 발생했습니다.
예:
string value = null;
if (value.Length == 0) // <-- Causes exception
{
Console.WriteLine(value); // <-- Never reached
}
이 idfsysobject. 오류::
>. 처리되지 않은 예외:
>. 시스템. 울레페렌스엑스티온: 설정되지 않은 인스턴스를 객체 참조 >. 객체의. dell. 프로그램지맹 ()
반면 어떤 [누얼레페렌스엑스티언스] [1] 및 만드는 방식은 다른 대답을 피하는 등 / 수리입니다 예외가 제기되었는지 haven& 많은 프로그래머가 어떤 방법을 배운 독립적으로 디버그입니다 # 39, 아직 개발 중에 이와 같은 예외는 아니다.
이것은 일반적으로 비주얼 스튜디오에서 손쉰운 덕분에 Visual Studio 디버거.
첫째, smartupdate 맞는 포착됨 - 지켜보리니 오류: 될 것입니다. https://stackoverflow.com/questions/4475464/ , 1< /sup> sup> Note<;;
다음 디버깅하지 시작하여 (F5) 또는 [ 부착합니다\ (해당 VS Debugger] 를 실행 중인 프로세스를 ] 4. ['데버거스브레이크'] [5] 스다크 사용하는 것이 좋을 수 있습니다, 이를 계기로 프롬프트합니다 디버거.
이제 디버거를 누얼레페렌스엑스티온 하지 않을 때 발생하며 (또는 처리되지 않은) (너희에게베풀어진 규칙 위에서 설정된?) 라인에 있는 idfsysobject. 발생했습니다. 때때로 쉽지 별색 오류가 발생합니다.
예를 들어,
var x = myString.Trim();
var x = str1.Trim() + str2.Trim();
이번 사고의 원인을 파악하는 데 필요한 시간을 시행하십시오 예외가 아니다. 검사 nulll 이뤄진다. 이전 표현식에서는 검사할 수 있는 이런 nulll 표현식에서는 처벌해야 한다고. 중단점 이 프로그램을 통해 추가 및 단계 적절하게. List. debugger.
< sup> 1< /sup>;;; 너무 공격적인 NPE 의 경우 브레이크의 던지는 중됩니다 협력하였습니다 닷넷 (.net) 기반 및 디버거 또는 3rd party 라이브러리와는 브레이크의 사용자 처리되지 않은 [예외 포착됨 제한하는 데 사용될 수 있습니다. 또한 VS2012 cxp 그냥 내 코드 어떤 난 추천합니까 구현해줍니다 잘 알려져 있다.
>. 내 코드를 활성화됨, 디버깅하지 경우 부트해 비헤이비어를 다르다. 내 코드 디버거를 부트해 활성화됨, 공통 언어 런타임 (CLR) 는 첫 번째 기회 예외를 throw 바깥쪽인지가 벤자민에 내 코드를 통과할 수 있는 내 코드
[1]: 이아스파스 https://msdn.microsoft.com/en-us/library/system.nullreferenceexception (v = vs. 110)
[5]: 이아스파스 https://msdn.microsoft.com/en-us/library/system.diagnostics.debugger.break (v = vs. 110)
object o = null;
DateTime d = (DateTime)o; // NullReferenceException
변환 (cast) 내의 unboxing from '객체' (또는 한 클래스를 '또는' ',' 시스템.발루티페 시스템.렌럼 호출하든 인터페이스입니다 유형용) 값을 to 유형이거나 (Nullable< > 아닌, ',') 는 그 자체가 '누얼레페렌스엑스티온'.
, 'A' 는 다른 방향의 변환 from boxing Nullable< > 디스크입니다. diskid '해스발루' 같음 '거짓' to 참조입니다 유형, 줄 수 있는 'null' 참조 '' 그러면 나중에 누얼레페렌스엑스티온 이어질 수 있습니다. 클래식 비유하사:
DateTime? d = null;
var s = d.ToString(); // OK, no exception (no boxing), returns ""
var t = d.GetType(); // Bang! d is boxed, NullReferenceException
다른 방법으로 복싱 발생하는 경우도 있다. 예를 들어 대체하십시오 비 일반 확장명은 방법:
public static void MyExtension(this object x)
{
x.ToString();
}
다음 코드는 문제가 됩니다.
DateTime? d = null;
d.MyExtension(); // Leads to boxing, NullReferenceException occurs inside the body of the called method, not here.
이러한 경우 발생할 때 사용하는 특수한 규칙 때문에, 복싱 ',' 런타임용으로 개발하십시오 Nullable< > 인스턴스입니다.
클래스 이름을 사용할 때 로켈이 추가에는 엔티티에는 엔티티입니다 framework 는 웹 폼 뒤에 코드 같은 클래스 이름을 절실해졌습니다.
웹 양식을 가지고 있고 그 고데베인드 클래스는 가정합니다 콘타스트리아스파스 문의하려면 엔티티입니다 이름 연락처.
그럼 던질 때 a 는 다음과 같은 코드를 누얼레페렌스엑스티온 전화하시기 컨텍스트입니다. 사브창즈 ()
Contact contact = new Contact { Name = "Abhinav"};
var context = new DataContext();
context.Contacts.Add(contact);
context.SaveChanges(); // NullReferenceException at this line
생각해서라도 완결성 다타콘테스트 클래스
public class DataContext : DbContext
{
public DbSet<Contact> Contacts {get; set;}
}
및 연락처 엔티티입니다 구분된다. 가끔 확장할 수 있도록 그 부분 클래스뿐만 엔티티입니다 클래스는 다른 파일에서 한다.
public partial class Contact
{
public string Name {get; set;}
}
이 오류가 발생할 때 모두 동일한 이름공간이 클래스용 엔티티입니다 및 고데베인드 있다. 이 문제를 해결하려면 클래스 또는 그 엔티티와 변경하십시오 고데베인드 콘타스트라프스트 대한 클래스를
토론의 투명지에 look at https://stackoverflow.com/questions/17136455/nullreferenceexception-in-dbcontext-savechanges
다른 일반적인 경우에 대해 조롱을 받을 수 있는 이 idfsysobject. 部门从 클래스뿐만 유닛 테스트 중. 사용되는 조롱하는 프레임워크입니다 상관없이 모든 적절한 수준의 클래스 계층 제대로 조 롱하였기 확인해야 합니다. 특히 '코드' 의 속성을 하테프콘테스트 참조됨 있는 모든 테스트 중인 조 롱하였기 합니다.
지켜보리니 " [누얼레페렌스엑스티온 테스트할 때 좋은 사용자 정의 오토리제이션스트리부트] (https://stackoverflow.com/questions/19314340/nullreferenceexception-thrown-when-testing-custom-authorizationattribute) ". 다소 대한 자세한 정보 예.
나는 이 질문을 다른 관점을. 이 질문에 대한 정렬하려면 ", 그밖에 ", 이를 피할 수 있을까요?
예를 들어 있는 여러 레이어에는 , 작업할 때, 컨트롤러 서비스를 업무 수행에 필요한 애플리케이션을 MVC 호츨 이런 시나리오용으로 의존성 주입 컨테이너입니다 누얼레페렌스엑스티온 초기화하려면 피하기 위해 서비스를 사용할 수 있습니다. 따라서, 도왔으매 don& # 39 에서 서비스 점검 및 그냥 security. 컨트롤러거 nulll 걱정할 필요가 없는 것처럼 항상 사용할 수 있는 (및 초기화되었습니다) 으로 singleton 또는 프로토타입 (prototype).
public class MyController
{
private ServiceA serviceA;
private ServiceB serviceB;
public MyController(ServiceA serviceA, ServiceB serviceB)
{
this.serviceA = serviceA;
this.serviceB = serviceB;
}
public void MyMethod()
{
// We don't need to check null because the dependency injection container
// injects it, provided you took care of bootstrapping it.
var someObject = serviceA.DoThis();
}
}
에 대한 문제를 어떻게 해야 합니까; it" ", 있을 수 있어 많은 분입니다.
더 " formal"; 는 이를 적용하는 방법을 개발하는 등 오류 상태 디자인 계약에 의해 코드에서. 즉, 함수 / 메서드 및 / 또는 심지어 불변 클래스를 설정할 필요가 , 와 사전조건에 포스트콘딧이언스 시스템에 개발하는 한편.
, 불변 클래스를 통해 빠른 시일 안에 있을 것이라고 할 수 없는 일부 제약 위반 클래스에 정상적인 사용 (이에 따라 클래스에 아닌 타 일관성 없는 상태). 해당 데이터 입력으로 주어진 함수 / 메서드로부터 사전조건에 짓궂군요 일부 제약 포스트콘딧이언스 설정하고 이를 따라야 하는 것은 결코 그들을 함수 / 방법 설정 없이 저들이요 위반 혐의로 구속 다시 출력입니다 따라야 합니다.
이렇게 하면 피할 수 있는 '건' 위반 혐의로 구속 누얼레페렌스엑스티온 결과가 설정되었습니다. 예를 들어, 'X' 를 사용하는 경우, 나중에 호출하십시오 시도하시겠습니까 클래스에서 객체 특성 중 하나는 'X' 는 '이 이어질 방법 및 null 값을 관심용 누얼레페렌스엑스티온':
public X { get; set; }
public void InvokeX()
{
X.DoSomething(); // if X value is null, you will get a NullReferenceException
}
그러나 " 설정할 경우, 속성 X null value" 귀의하지않는다고 합니다. 전에 같은 조건으로 메서드로부터 관심용 책정안 설명됨 않도록 할 수 있습니다.
//Using code contracts:
[ContractInvariantMethod]
protected void ObjectInvariant ()
{
Contract.Invariant ( X != null );
//...
}
이 경우, [코드 계약] [2] 닷넷 (.net) 기반 애플리케이션을 위한 프로젝트 존재합니다.
또는 계약에 의해 디자인 [어설션을] [3] 사용하여 적용할 수 있습니다.
[2]: 110%29.aspx http://msdn.microsoft.com/en-us/library/dd264808%28v = vs. [3]: http://en.wikipedia.org/wiki/Assertion_% 28software_development% 29
'A' 의 속성을 액세스하려는 누얼레페렌스엑스티온 때 발생하며 우리는 빈 문자열 값이 될 때 우리는 nulll 객체인지 또는 액세스하려는 구체화하십시오 방법.
예를 들면 다음과 같습니다.
string str = 구체화하십시오. 비어 있습니다. str. 토로베르 (); 예외가 throw nulll 참조입니다 //
Public Class 인 { 공용 구체화하십시오 이름 {프레젠테이션이든. 세트. } } 사람이 오브제퍼슨. 예외가 throw nulll 세르누스 오브제퍼슨.나미 / / /
내가 어렸을 때 객체를 인스턴스입니다 설정되지 않은 개체 참조입니다 가져오는 '찾았다' 는 이 보내 보기입니다 렌더링합니다 내에서 보기입니다 모델용 다음과 같습니다.
@{
MyEntity M = new MyEntity();
}
@RenderPage("_MyOtherView.cshtml", M); // error in _MyOtherView, the Model was Null
모델이 그 nulll δ1 미더비에프 디버깅하지 보였다. Until I 로 변경했다.
@{
MyEntity M = new MyEntity();
}
@Html.Partial("_MyOtherView.cshtml", M);
또한 했다.
또 이유는 없다 ',' 타마라자파르시알 didn& # 39 는 Visual Studio 에서 시작하는 때문에 가끔 던지는 보았으매 오류 # 39 의 경우 '곡선' 선 '포리치 루프 내부에 만들어진 타마라자파르시알 it& 다르게' s not really 오류가 있더라도, it& # 39:
@inherits System.Web.Mvc.WebViewPage
@{
ViewBag.Title = "Entity Index";
List<MyEntity> MyEntities = new List<MyEntity>();
MyEntities.Add(new MyEntity());
MyEntities.Add(new MyEntity());
MyEntities.Add(new MyEntity());
}
<div>
@{
foreach(var M in MyEntities)
{
// Squiggly lines below. Hovering says: cannot convert method group 'partial' to non-delegate type Object, did you intend to envoke the Method?
@Html.Partial("MyOtherView.cshtml");
}
}
</div>
하지만 난 아무 문제 없이 대체하십시오 error" " 응용 프로그램을 실행할 수 있었다;;). 난 없앨 수 있는 구조를 변경하여 '오류' 포리치 루프를 다음과 같습니다.
@foreach(var M in MyEntities){
...
}
이 때문에 비록 느낌이 나는 전송되었기 Visual Studio 는 오독 필드앰퍼샌드 및 브래킷에.
여기에 대답을 null reference 는 무엇을, 어떻게 설명할 수 없는 많은 좋은 디버그로 거잖나. 하지만, 적어도 이 문제에 대해 매우 작은 것을 막기 위해 쉽게 잡을 수 있을지.
예를 들어, 서로 다른 방법을 볼 수 있는 것을 확인할 수 있다 ',' 아르구망누 알렉세페시옹 nulll 및 인수만 경우 예외를 위해 만든 것은 이 정확한 것입니다.
심지어 '대한' 이 구성자를 아르구망누 알렉세페시옹 이름이 &prs. 메시지와 인수로 문제가 뭔지 정확히 알 수 있도록 개발자.
public void DoSomething(MyObject obj) {
if(obj == null)
{
throw new ArgumentNullException("obj", "Need a reference to obj.");
}
}
라이브러리보다는 데 도움을 줄 수 있는 여러 가지가 있습니다. " Resharper"; 예를 들어 제공할 수 있는 코드를 작성할 때 경고와 함께 사용하는 경우, 특히 그들의 속성: [노누야트리부트] [1]
public void DoSometing([NotNull] obj)
이렇게 해서 '목표' 의 일부분으로 빌드 프로세스를 만들고 포스트샤프 검사됩니다 nulll dell. 런타임용으로 개발하십시오. 참조: 포스트샤프 nulll 확인란
Plain old 코드를 사용하여 코드 또는 항상 자신의 외곽진입 수 있습니다. 예를 들어 이 구조체입니다 잡기 위해 사용할 수 있는 nulll 참조입니다. # 39 의 모델링되지 it& Nullable< T>, 이후 동일한 개념을 ',':
[System.Diagnostics.DebuggerNonUserCode]
public struct NotNull<T> where T: class
{
private T _value;
public T Value
{
get
{
if (_value == null)
{
throw new Exception("null value not allowed");
}
return _value;
}
set
{
if (value == null)
{
throw new Exception("null value not allowed.");
}
_value = value;
}
}
public static implicit operator T(NotNull<T> notNullValue)
{
return notNullValue.Value;
}
public static implicit operator NotNull<T>(T value)
{
return new NotNull<T> { Value = value };
}
}
사용하는 것과 같은 방식으로 사용하는 것과 매우 유사한 ',' 목표를 정확히 반대, T> Nullable< 제외하고는 골을 허용하지 않도록 - 'null'. 몇 가지 예를 들면 다음과 같습니다.
NotNull<Person> person = null; // throws exception
NotNull<Person> person = new Person(); // OK
NotNull<Person> person = GetPerson(); // throws exception if GetPerson() returns null
'T', ',' NotNull< T> 묵시적으로 캐스트 주고 그냥 어디든요 대한 필요할 때 사용할 수 있도록. 예를 들어 'a' 는 해당 객체를 직접 전달할 수 있습니다. ',' NotNull< 메서드입니다 Person>.
Person person = new Person { Name = "John" };
WriteName(person);
public static void WriteName(NotNull<Person> person)
{
Console.WriteLine(person.Value.Name);
}
위에서 알 수 있듯이 누얼바이 때와 마찬가지로 '가치' 를 통해 기본 가치를 액세스하려면 재산이잖아 명시적인 또는 암시적입니다 캐스트 (cast), 예를 들어 볼 수 있습니다 사용할 수도 있습니다 함께 반환 값은 다음과 같습니다.
Person person = GetPerson();
public static NotNull<Person> GetPerson()
{
return new Person { Name = "John" };
}
또는 그냥 'T' 되돌려줍니다 때 이 방법을 사용할 수도 있습니다 (이 경우 '사람') a 팀 수행여. 예를 들어, 다음 코드는 코드 위에 마찬가지로 것이다.
Person person = (NotNull<Person>)GetPerson();
public static Person GetPerson()
{
return new Person { Name = "John" };
}
',' NotNull< 합칩니다 T> 확장명으로 메서드입니다 진실이며당신이 더욱 다룰 수 있는 상황. 예를 들어보겠습니다 뭐한테 확장 메서드를 보일 수 있습니다.
[System.Diagnostics.DebuggerNonUserCode]
public static class NotNullExtension
{
public static T NotNull<T>(this T @this) where T: class
{
if (@this == null)
{
throw new Exception("null value not allowed");
}
return @this;
}
}
Avamar 예는 방식을 사용할 수 있습니다.
var person = GetPerson().NotNull();
깃허브
참고로 위 코드는 support. dell. 깃허브, I made it http://support. 찾을 수 있습니다.
https://github.com/luisperezphd/NotNull
C # 6.0 은 " nulll 조건 operator"; 이번 주는 좀. 이 기능을 사용하면, 그들 중 하나를 네스트된 객체에는 참조할 수 있습니다 'null' 는 전체 표현식에서는 아웃하기로 되돌려줍니다 'null'.
이 수를 줄이고 nulll 검사를 해야 하는 경우도 있습니다. 각 구문 전에 joyon. 물음표 (?) 했다. 예를 들어 다음과 같은 코드를 시행하십시오.
var address = country?.State?.County?.City;
'국가' 가 있다는 걸 알았다 '국가' 와 '상태' 라는 속성을 가진 타입의 객체가 드릴링됩니다. 만약 '국가', '상태', '현', 'null' 또는 '도시' 는 'null' 다음 '주소 될 것입니다. 따라서 '주소' 는 'null' 여부를 확인할 수 밖에 없습니다.
C # 의 대표, 뭔가 할 수 있습니다. '"에 대한 좋은 nullable< t> 누얼바이 type 전환하여 이후 같은 물음표 때문에' int? '.
C # 이 같은 일을 했다. ',' 잘 될 경우, 그 위에 구조체입니다 NotNull< T> 비슷한 대표, 어쩌면 느낌표 (!) 다음과 같은 항목을 쓸 수 있도록 public void 라이텐임 (개인! ' 사람) '.
[1]: https://www.jetbrains.com/resharper/help/Reference_Code_Annotation_Attributes.html # 노누야트리부트
C # 에서 연산자를 사용하여 고칠 수 있다고 한 청소하십시오 누얼레페렌스엑스티온 nulll 조건 6-셀 및 처리할 수 있는 방법을 쓰기 적은 코드 nulll 점검.
예
var name = p?.Spouse?.FirstName;
같습니다.
if (p != null)
{
if (p.Spouse != null)
{
name = p.Spouse.FirstName;
}
}
그 결과 널일 이름은 때 널임 때 또는 p, p. 배우자 널임.
그렇지 않으면 변수 이름 값을 배정됩니다 p. 세페우스자퍼스트나미스
자세한 내용은: Nulll 조건 운영자