2014-06-28 101 views
-8

是給出錯誤ship1未找到。 我只在符合條件時聲明ship1。 其他明智的我已經放置其他條件,重新運行的功能。 這是編譯問題,所以我早先被告知...嘗試捕捉將無法正常工作。如何處理符號未找到java中的編譯錯誤?

public static int plantNavy(BattleBoard myBattle, int counter) { 
    System.out.println("Im innnnn"); 
    if (counter == 0) { 
     System.out.println("\nPlacing Large Ship"); 
    } 
    else if (counter == 1) { 
     System.out.println("Placing Medium Ship"); 
    } 
    else if (counter == 2) { 
     System.out.println("Placing Medium Ship"); 
    } 
    else if (counter == 3) { 
     System.out.println("Placing Small Ship"); 
    } 
    else if (counter == 4) { 
     System.out.println("Placing Small Ship"); 
    } 

    System.out.println("Enter 0 to place ship horizontally"); 
    System.out.println("Enter 1 to place ship vertically"); 

    String align = shipAlignment.nextLine(); 
    if (align.length() > 1) { 
     System.out.println("Inappropriate value entered. Please enter again"); 
     plantNavy(myBattle,counter); 
    } 

    if (align.charAt(0) - 48 == 0 || align.charAt(0) - 48 == 1) { 
     if (align.charAt(0) - 48 == 0) { 
      if (counter == 0) { 
       BattleShip ship1 = new LargeShip(false); 
      } 
      else if (counter == 1) { 
       BattleShip ship1 = new MediumShip(false); 
      } 
      else if (counter == 2) { 
       BattleShip ship1 = new MediumShip(false); 
      } 
      else if (counter == 3) { 
       BattleShip ship1 = new SmallShip(false); 
      } 
      else if (counter == 4) { 
       BattleShip ship1 = new SmallShip(false); 
      } 
     } 
     if (align.charAt(0) - 48 == 1) { 
      if (counter == 0) { 
       BattleShip ship1 = new LargeShip(true); 
      } 
      else if (counter == 1) { 
       BattleShip ship1 = new MediumShip(true); 
      } 
      else if (counter == 2) { 
       BattleShip ship1 = new MediumShip(true); 
      } 
      else if (counter == 3) { 
       BattleShip ship1 = new SmallShip(true); 
      } 
      else if (counter == 4) { 
       BattleShip ship1 = new SmallShip(true); 
      } 
     } 
    } 
    else { 
     System.out.println("Inappropriate value entered"); 
     counter=plantNavy(myBattle,counter); 
    } 

     System.out.println("Enter Ship Placing position"); 
     String shipPos = shipPlace.next(); 
     if (shipPos.length() > 3 || shipPos.length() < 2) { 
      System.out.println("Inappropriate target. Please enter again"); 
      counter = plantNavy(myBattle,counter); 
     } 
     else if ((int) (shipPos.charAt(1))-48 < 1 || (int) shipPos.charAt(1)-48 > 10) { 
      System.out.println("Inappropriate target. Please enter again"); 
      counter = plantNavy(myBattle,counter); 
     } 

     else if ((int) (shipPos.charAt(0)) < 65 || (int) shipPos.charAt(0)> 74) { 
      System.out.println("Inappropriate target. Please enter again"); 
      counter = plantNavy(myBattle,counter); 
     } 

     int x_pos; 
     int y_pos; 

     if (shipPos.length() == 3) { 
      shipPos = shipPos.charAt(0) + "10"; 
     } 
     if (shipPos.length() == 2) { 
      x_pos = (int) (shipPos.charAt(1))-49; 
     } 
     else { 
      x_pos = 9; 
     } 
     y_pos = (int) (shipPos.charAt(0))-65; 

     System.out.println(x_pos); 
     System.out.println(y_pos); 

     boolean plantCor = myBattle.addShip(ship1,x_pos,y_pos); 

     if (plantCor == true) { 
      System.out.println(myBattle.printActualBoard()); 
      counter++; 
      return counter; 
     } 

     if (plantCor == false) { 
      System.out.println("Incorrect Placement. Place Again in empty area."); 
      counter = plantNavy(myBattle,counter); 
     } 
    } 
+7

這是編譯時錯誤。異常處理是一個運行時概念。 –

+0

什麼是'例外'。它應該是'Exception'。和括號.. –

+2

爲什麼你需要處理的情況下,當一個變量沒有找到?爲什麼不直接定義呢? –

回答

0

在你的方法頂部聲明戰艦SHIP1 = NULL變量並使用它:

public static int plantNavy(BattleBoard myBattle, int counter) { 
    BattleShip ship1 = null; 

在if塊,只是分配給它不要再聲明變量。即,做

if (counter == 0) { 
    ship1 = new LargeShip(false); 
} 

if (counter == 0) { 
    BattleShip ship1 = new LargeShip(false); // note the difference! 
} 

以後你可以檢查它是否是空,看是否SHIP1已創建。

if (ship1 == null) { 
    // then no ship1 has been created yet. 
} 

編輯
幽州的評論:

@HovercraftFullOfEels我嘗試這種技術,但它給缺少return語句的錯誤。只有在船舶成功放置後才能返回。

然後給它必要的返回語句。你的代碼有一堆返回嵌套在if語句中。如果if語句都不是真的,那麼方法有可能結束而不返回任何內容,這是不允許的。

一種解決方案是在方法底部添加一個默認返回語句,但如果這是我的代碼,我會查看整個方法並重新編寫它,將其重構爲幾個更小的更簡單的方法,用戶交互出這個方法。


編輯2
我看到的另一個問題是,你在一個危險的和不必要的方式使用遞歸:

if (shipPos.length() > 3 || shipPos.length() < 2) { 
    System.out.println("Inappropriate target. Please enter again"); 
    counter = plantNavy(myBattle, counter); 
    } 

需要注意的是如果輸入錯誤的輸入,你打電話該方法再次在相同的方法內,但沒有意識到,即使該方法將再次調用,在遞歸調用返回後,原始方法仍將運行完成錯誤輸入。我的建議,避免在這裏遞歸,再次重構和簡化你的代碼將幫助你做到這一點。

取而代之的是,獲取用戶輸入的一個單獨的方法,驗證輸入,因爲它正在被獲取(一個簡單的do-while循環就足夠了),然後一旦獲得了所有必要的放置船的輸入,調用你的方法放置一艘而沒有其中有任何用戶輸入。


編輯3
下一步,你想擺脫那些神奇的數字,你正在使用的,使你的代碼熊理解和調試。

+0

謝謝。你的編輯2解決了我的問題。我在每個遞歸語句 –

+0

@ user3005132之後添加了返回計數器:您的代碼可能會編譯,但該遞歸是有風險的下注,並且可能會咬你。 –

+0

我被困在另一個問題。你能幫我通過電子郵件嗎?我現在得到太多的票,我不能問問題。 @氣墊船 –