Heim  >  Artikel  >  Java  >  Warum kann diese Schreibweise „aa“.equals(a) Nullzeiger vermeiden?

Warum kann diese Schreibweise „aa“.equals(a) Nullzeiger vermeiden?

高洛峰
高洛峰Original
2016-12-16 10:20:281427Durchsuche

public static void main(String[] args) {

	String a=null;	if("aa".equals(a))//这种情形,不出现空指针异常
	//if(a.equals("aa"))//出现空指针异常
	{
	System.out.println(true);
	}	else {
	System.out.println(false);
	}
	}

Testen Sie die beiden oben genannten unterschiedlichen Vergleichsanweisungen. Der erste Satz verursacht keine Nullzeigerausnahme, der zweite Satz jedoch.
Beim Vergleich von Variablen und Konstanten stehen daher im Allgemeinen die Konstanten an erster Stelle. Um eine Nullzeigerausnahme zu vermeiden.
Aber mein Problem ist: Wenn die Variable vorne steht, wenn die Variable gelesen wird und die Variable leer ist, tritt eine Ausnahme auf.
Warum muss die Variable a nicht mehr gelesen werden, wenn die Variable am Ende steht? Da Sie vergleichen und unbedingt lesen möchten, ist die Frage
nur eine Frage der Reihenfolge. Warum meldet es keinen Nullzeiger, wenn es am Ende platziert wird?

Zu diesem Thema hörte ich schon früher, als ich im Unternehmen arbeitete, andere sagen, dass diese Schreibweise dazu dient, Nullzeiger zu vermeiden. Tatsächlich habe ich es überprüft und festgestellt, dass Nullzeiger vermieden werden können. Als ich mich später eingehender mit der oben gestellten Frage befassen wollte, erzählte mir ein alter Kollege, dass dies auch ein Programmierstandard sei. Wenn man über die heutigen Normen nachdenkt, gibt es bestimmte Gründe.

Diese Frage kam heute in unserer technischen Austauschgruppe auf und hat mich zum Nachdenken gebracht.

Also habe ich einen Beitrag geschrieben,

Ich habe einen Blick auf die Methode equal der String-Klasse geworfen

public boolean equals(Object anObject) {
		 if (this == anObject) {
			 return true;
		 }
		 if (anObject instanceof String) {
			 String anotherString = (String) anObject;
			 int n = value.length;
			 if (n == anotherString.value.length) {
				 char v1[] = value;
				 char v2[] = anotherString.value;
				 int i = 0;
				 while (n-- != 0) {
					 if (v1[i] != v2[i])
							 return false;
					 i++;
				 }
				 return true;
			 }
		 }
		 return false;
	 }

Aber ich habe ein Problem

I Ich habe den Quellcode. Nachdem ich ihn mir angesehen habe, verstehe ich ihn, aber wenn ein Objekt im Quellcode leer ist, tritt dann nicht eine Nullzeigerausnahme auf?
Nach einiger Diskussion später bin ich zu folgendem Schluss gekommen.

Das Problem tritt in der aufrufenden Methode auf. Weil der Nullwert kein String-Objekt ist. Und Sie rufen die Instanzmethode des String-Objekts über die deklarierte String-Objektreferenz auf. Natürlich nicht. nullDie Methode wurde aufgerufen.

Das System hat also eine Nullzeiger-Ausnahme gemeldet.

Also, um den Titel des Artikels wiederzugeben: Dadurch werden Anomalien der Kontrollnadel wirklich vermieden. Schließlich ist die Form „aaa“ nicht null und kann Methoden aufrufen. Dann können wir mit der Methode „equals“ in der Klasse „String“ vergleichen und alles ist in Ordnung.



Mehr „aa“.equals(a) Warum kann diese Schreibweise Nullzeiger vermeiden? Für verwandte Artikel achten Sie bitte auf die chinesische PHP-Website!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn