2012-04-02 43 views
0

是否允許在Java中使用以下代碼?我的程序不起作用,除非我將此行註釋掉,而且我不確定是否允許在if中使用多個& &語句。Java中允許多個&&語句?

if(number.isBusy() && number2.isBusy() && number3.isBusy() && number4.isBusy() && number5.isBusy()) {} 

編輯補充: 如果您註釋掉上面給出的行,程序將實際顯示在輸出窗口的東西(雖然那得到的東西加入到它的唯一的事情就是「5號」),如果它被留下,所有的輸出都是零。

這是整個程序現在:

// FILE: Line.java 
// This program illustrates the use of the lineSimulate method which uses 
// a simple queue to simulate cars waiting at a car wash. 

import java.util.LinkedList; 
import java.util.Queue; 
import java.util.Scanner; 
// import edu.colorado.simulations.BooleanSource; 
// import edu.colorado.simulations.Line ; 
// import edu.colorado.simulations.Averager; 

/****************************************************************************** 
* The <CODE>CarWash</CODE> Java application illustrates the use of 
* the <CODE>lineSimulate</CODE> method. 
* The illustration uses the following values: 
* <CODE> 
* <br>lineTime = 240 
* <br>arrivalTime = 0.0025 
* <br>totalTime = 6000 
* </CODE> 
* 
* <p><dt><b>Java Source Code for this class:</b><dd> 
* <A HREF="../applications/CarWash.java"> 
* http://www.cs.colorado.edu/~main/applications/CarWash.java 
* </A> 
* 
* @author Michael Main 
* <A HREF="mailto:[email protected]"> ([email protected]) </A> 
* 
* @version 
* Jun 12, 1998 
******************************************************************************/ 
public class LineWait 
{ 
    /** 
    * The main method activates <CODE>lineSimulate</CODE> with the values: 
    * <CODE> 
    * <br>lineTime = 240 
    * <br>arrivalTime = 0.0025 
    * <br>totalTime = 6000 
    * </CODE> 
    * <BR>The <CODE>String</CODE> argument (<CODE>args</CODE>) is not used in 
    * this implementation. 
    **/ 
    public static void main(String[ ] args) 
    { 

     final int LINETIME = 100 + (int)(Math.random() * ((400) + 1)); 
     final double ARRIVALPROB = (Math.random() * ((.1) + 1)); 
     final int TOTALTIME = 6000; 

     lineSimulate(LINETIME, ARRIVALPROB, TOTALTIME); 
    } 

    /** 
    * Simulate the running of a car washer for a specified amount of time. 
    * @param <CODE>lineTime</CODE> 
    * the number of seconds required to wash one car 
    * @param <CODE>arrivalProb</CODE> 
    * the probability of a customer arriving in any second, for example 
    * 0.1 is 10% 
    * @param <CODE>totalTime</CODE> 
    * the total number of seconds for the simulation 
    * <dt><b>Precondition:</b><dd> 
    * <CODE>lineTime</CODE> and <CODE>totalTime</CODE> are positive; 
    * <CODE>arrivalProb</CODE> lies in the range 0 to 1. 
    * <dt><b>Postcondition:</b><dd> 
    * The method has simulated a car wash where <CODE>lineTime</CODE> is the 
    * number of seconds needed to wash one car, <CODE>arrivalProb</CODE> is 
    * the probability of a customer arriving in any second, and 
    * <CODE>totalTime</CODE> is the total number of seconds for the 
    * simulation. Before the simulation, the method has written its three 
    * parameters to <CODE>System.out</CODE>. After the simulation, the method 
    * has written two pieces of information to <CODE>System.out</CODE>: 
    * (1) The number of cars washed, and (2) The average waiting time for 
    * customers that had their cars washed. (Customers that are still in the 
    * queue are not included in this average). 
    * @exception java.lang.IllegalArgumentException 
    * Indicates that one of the arguments violates the precondition. 
    **/ 
    public static void lineSimulate 
    (int lineTime, double arrivalProb, int totalTime) 
    { 
     Queue<Integer> arrivalTimes = new LinkedList<Integer>(); 
     Queue<Integer> arrivalTimes2 = new LinkedList<Integer>(); 
     Queue<Integer> arrivalTimes3 = new LinkedList<Integer>(); 
     Queue<Integer> arrivalTimes4 = new LinkedList<Integer>(); 
     Queue<Integer> arrivalTimes5 = new LinkedList<Integer>(); 
     int next; 
     BooleanSource arrival = new BooleanSource(arrivalProb); 
     Line number = new Line(lineTime); 
     Line number2 = new Line(lineTime); 
     Line number3 = new Line(lineTime); 
     Line number4 = new Line(lineTime); 
     Line number5 = new Line(lineTime); 
     Averager waitTimes = new Averager(); 
     Averager waitTimes2 = new Averager(); 
     Averager waitTimes3 = new Averager(); 
     Averager waitTimes4 = new Averager(); 
     Averager waitTimes5 = new Averager(); 
     int currentSecond; 
     // Write the parameters to System.out. 
     System.out.println("Seconds to wait in line " + lineTime); 
     System.out.print("Probability of customer arrival during a second: "); 
     System.out.println(arrivalProb); 
     System.out.println("Total simulation seconds: " + totalTime); 

     // Check the precondition: 
     if (lineTime <= 0 || arrivalProb < 0 || arrivalProb > 1 || totalTime < 0) 
     throw new IllegalArgumentException("Values out of range");   




     for (currentSecond = 0; currentSecond < totalTime; currentSecond++) 
     { // Simulate the passage of one second of time. 

     // Check whether a new customer has arrived. 
     if (arrival.query()) 
      { 
       System.out.println("Test1"); 
       if(number.isBusy() && number2.isBusy() && number3.isBusy() && number4.isBusy() && number5.isBusy()) 
       { 
        System.out.println("Test2"); 
        if(arrivalTimes.size() < arrivalTimes2.size() && arrivalTimes.size() < arrivalTimes3.size() && arrivalTimes.size() < arrivalTimes4.size() && arrivalTimes.size() < arrivalTimes5.size()) 
        { 
         arrivalTimes.add(currentSecond); 
         System.out.println("Test"); 
        } 
        else if(arrivalTimes2.size() < arrivalTimes.size() && arrivalTimes2.size() < arrivalTimes3.size() && arrivalTimes2.size() < arrivalTimes4.size() && arrivalTimes2.size() < arrivalTimes5.size()) 
        { 
         arrivalTimes2.add(currentSecond); 
         System.out.println("Test"); 
        } 
        else if(arrivalTimes3.size() < arrivalTimes.size() && arrivalTimes3.size() < arrivalTimes2.size() && arrivalTimes3.size() < arrivalTimes4.size() && arrivalTimes3.size() < arrivalTimes5.size()) 
        { 
         arrivalTimes3.add(currentSecond); 
         System.out.println("Test"); 
        } 
        else if(arrivalTimes4.size() < arrivalTimes.size() && arrivalTimes4.size() < arrivalTimes3.size() && arrivalTimes4.size() < arrivalTimes2.size() && arrivalTimes4.size() < arrivalTimes5.size()) 
        { 
         arrivalTimes4.add(currentSecond); 
         System.out.println("Test"); 
        } 
        else{arrivalTimes5.add(currentSecond);} 
       } 

      } 

      // Check whether we can put the person into a line. 
      if ((!number.isBusy()) && (!arrivalTimes.isEmpty())) 
      { 
       next = arrivalTimes.remove(); 
       waitTimes.addNumber(currentSecond - next); 
       number.startMoving(); 
      } 
      if ((!number2.isBusy()) && (!arrivalTimes2.isEmpty())) 
      { 
       next = arrivalTimes2.remove(); 
       waitTimes2.addNumber(currentSecond - next); 
       number2.startMoving(); 
      } 
      if ((!number3.isBusy()) && (!arrivalTimes3.isEmpty())) 
      { 
       next = arrivalTimes3.remove(); 
       waitTimes3.addNumber(currentSecond - next); 
       number3.startMoving(); 
      } 
      if ((!number4.isBusy()) && (!arrivalTimes4.isEmpty())) 
      { 
       next = arrivalTimes4.remove(); 
       waitTimes4.addNumber(currentSecond - next); 
       number4.startMoving(); 
      } 
      if ((!number5.isBusy()) && (!arrivalTimes5.isEmpty())) 
      { 
       next = arrivalTimes5.remove(); 
       waitTimes5.addNumber(currentSecond - next); 
       number5.startMoving(); 
      } 


     // Subtract one second from the remaining time in the current li 
     number.reduceRemainingTime(); 
     number2.reduceRemainingTime(); 
     number3.reduceRemainingTime(); 
     number4.reduceRemainingTime(); 
     number5.reduceRemainingTime(); 
     } 




     // Write the summary information about the simulation. 
     System.out.println("\nCustomers served Line1: " + waitTimes.howManyNumbers()); 
     if (waitTimes.howManyNumbers() > 0) 
     System.out.println("Average wait Line1: " + waitTimes.average() + " sec"); 
     System.out.println("\nCustomers served Line2: " + waitTimes2.howManyNumbers()); 
     if (waitTimes.howManyNumbers() > 0) 
     System.out.println("Average wait Line2: " + waitTimes2.average() + " sec"); 
     System.out.println("\nCustomers served Line3: " + waitTimes3.howManyNumbers()); 
     if (waitTimes.howManyNumbers() > 0) 
     System.out.println("Average wait Line3: " + waitTimes3.average() + " sec"); 
     System.out.println("\nCustomers served Line4: " + waitTimes4.howManyNumbers()); 
     if (waitTimes.howManyNumbers() > 0) 
     System.out.println("Average wait Line4: " + waitTimes4.average() + " sec"); 
      System.out.println("\nCustomers served Line5: " + waitTimes5.howManyNumbers()); 
     if (waitTimes.howManyNumbers() > 0) 
     System.out.println("Average wait Line5: " + waitTimes5.average() + " sec"); 

} 
} 
+2

這是允許的。你能擴展「不行」嗎? – 2012-04-02 03:56:40

+0

是...... – 2012-04-02 03:56:54

+0

定義'不起作用'。大概你已經確定它編譯了,但這也意味着它是合法的Java。 – EJP 2012-04-02 04:00:30

回答

2

是,可以鏈的邏輯運算符的有效無限數量在一起。

7

該表達式是完全合法的語法。 &&運營商是短路邏輯「與」:評估從左到右進行,並將在評估爲false的第一期(如果有)停止。

編輯

根據您的編輯,我猜測,問題是,if的身體進入只有number所有。 。 。,number5正忙。 (這只是一個猜測,因爲你不會發布Line類的樣子,或者你想看到什麼樣的行爲。)

作爲一個方面說明,我認爲你的程序會更易讀(和如果您定義了封裝了QueueLineAverager的類別,則可維護)。 (可能這三個對象組合在一起構成了對你的問題域有意義的東西。)然後你可以聲明這些對象的一個​​數組(或者可能更好一些),並且與它們一起工作,而不用作爲獨立變量來處理它們。

0

是的,這是允許的。 & &是shortcircuit操作符,所以一旦謂詞之一失敗將不會發生進一步的評估。如果你想要評估所有的條件,你可以使用&(即只有一個&符號),所有的謂詞都會被評估。想要這個的主要原因是如果謂詞有你想要發生的副作用。這通常是不好的做法,但在你的情況下,它看起來像這就是你想要的...

if (number.isBusy() & 
    number2.isBusy() & 
    number3.isBusy() & 
    number4.isBusy() & 
    number5.isBusy()) { 
} 
isBusy()

將執行,結果將是和返回值。

if (number.isBusy() && 
    number2.isBusy() && 
    number3.isBusy() && 
    number4.isBusy() && 
    number5.isBusy()) { 
} 

isBusy()將執行,直到一個失敗,以下isBusy()的將不會被調用。

0

user1247751應提供更多信息以獲得更好的答案。

但是,根據所提供的信息,我可以推測isBusy方法中的一個會更改系統的狀態,使其無法工作。