2017-04-16 5 views
-1

Ich versuche herauszufinden, warum & Operator löst eine Ausnahme und unterbricht mein Programm, aber wenn ich && operator das Programm arbeitet ohne Fehler.
Hier ist der Teil des Codes:Java & und & Operatoren Schwierigkeiten

  • books eine Arraylist von Objekten Book ist.
  • areYouBook kehrt true wenn die ISBN des Buches Ich bin auf der Suche nach Übereinstimmungen a.
  • Das Verfahren findBook prüft, ob ich das Buch bereits in der Arraylist. Wenn das Verfahren null zurückgibt, bedeutet dies, ich habe das Buch erstellen und fügen Sie es die ArrayList.

Vielen Dank für Ihre Hilfe!

public Book findBook(int a){ 
    int i=0; 
    while((i<(books.size()))&!((books.get(i)).areYouBook(a))) 
     i++; 
    if(i<(books.size())) 
     return books.get(i); 
    else 
     return null; 
} 
+1

Weil '&' ist die [bitweise AND-Operator] (https://docs.oracle.com/javase/tutorial/java/nutsandbolts /operators.html), nicht das logische UND. – domsson

+2

Außerdem empfehle ich Ihnen, die Klammern '{}' für Ihre Blöcke ('while',' if', 'else') die ganze Zeit zu verwenden und Ihren Code korrekt einzurücken. Das ist nicht nur schwer zu lesen und zu verstehen, es muss auch auf eine Weise ausgeführt werden, die Sie nicht beabsichtigt haben. – domsson

+1

[Unterschied zwischen & und &&] (http://stackoverflow.com/questions/5564410/difference-between-and) – matoni

Antwort

1

Ich kann Ihnen hier sagen, dass der Unterschied zwischen dem & Betreiber und dem && Betreiber ist, dass && die erste expresion zu überprüfen, und wenn es falsch ergibt, dann wird es einfach aus der Kontrolle brechen, aber die & Betreiber wird den folgenden Ausdruck ausführen, unabhängig davon, ob der erste falsch war oder nicht.

Also, der Code, den Sie geschrieben haben, wird (i<(books.size())) überprüfen, und ob das falsch ist oder nicht, !((books.get(i)).areYouBook(a)) wird immer noch ausgeführt werden.

Wenn Sie jedoch && und (i<(books.size())) falsch verwendet haben, wird der zweite Teil Ihres Schecks, der !((books.get(i)).areYouBook(a)) ist, nicht ausgeführt.

Ich hoffe, das hilft.

Edit:

Sie erwähnten einen Fehler ausgelöst wird, wenn Sie den & Operator anstelle des && Operator verwendet.Da der Operator & den zweiten Ausdruck ausführt, selbst wenn der erste falsch ist, frage ich mich, ob Ihr zweiter Ausdruck tatsächlich einen Fehler wirft, und wird aufgerufen, wenn Sie & verwenden.

Edit 2:

Ok. Sagen wir, dass books eine Größe von 12 (Indizes 0-11) nur zur Demonstration hat. Wenn Sie also den Operator & verwenden, wird Ihre while-Schleife ausgeführt, bis i 12 ist. Wenn i 12 ist, führt die Schleife (i<(books.size())) aus (was false zurückgibt) und FORTSETZEN, um !((books.get(i)).areYouBook(a)) auszuführen. Innerhalb des zweiten Ausdrucks wird books.get(i) aufgerufen, wenn i 12 ist. Die books Liste geht nur von den Indizes 0 bis 11 und wirft eine java.lang.IndexOutOfBoundsException. durch die & & Symbol dargestellt zu verwenden, ist das heißt wahre & & Falsch Entschlüssen auf False

+0

Danke, aber wenn ich && das Programm funktioniert perfekt, aber wenn ich & verwende, bekomme ich diese Fehlermeldung "Ausnahme im Thread" main "java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 \t bei Java .util.ArrayList.rangeCheck (Unbekannte Quelle) \t bei java.util.ArrayList.get (unbekannte Quelle) " –

+0

@ AilinW.B. Ahh, das macht Sinn. Lass mich meine Antwort bearbeiten; Ich sehe, was vor sich geht ... –

+0

Die Fehlerausnahme ist in Index 0, was ich denke, weil die Arraylist leer ist, oder? –

0

java conditional operators sagt:

die Betreiber & & und || zeigen ein "Kurzschluss" -Verhalten, was bedeutet, dass der zweite Operand nur bei Bedarf ausgewertet wird.

die logische UND-Operator &&Kurz cuircuting wenn die linke Seite Bedingung false ist sein wird, auf der anderen Seite, wenn die linke Seite Zustand false die rechte Seite Bedingung ist nie ausgeführt werden.

aber die bitwise & operator führt eine bitweise UND-Operation durch.

-1

Die logische UND, dass Sie versuchen. Der einzelne Ampersand "&" stellt ein bitweise UND dh 0101 & 0100 beschließt, 0110.

+0

Das einzelne kaufmännische Und-Zeichen kann auch anstelle des doppelten kaufmännischen Undersands mit einer kleinen Änderung verwendet werden; Das einzelne kaufmännische Und wird immer den folgenden Ausdruck ausführen, ob sich der erste als wahr herausstellt oder nicht. –

+2

Interessant, ich habe noch nie das einzige kaufmännische Und-Zeichen gesehen. Danke, dass du das unterstrichen hast! –