2016-02-26 51 views
-2

我的代碼應做到以下這部分:if語句和的try-catch不會阻止錯誤

  1. 檢查輸入是INT型(的try-catch)
  2. 如果輸入一個INT,檢查它是否在列表之間:

代碼

public static void selection(List<Performer> listperformer) 
{ 
    int i=0; 
    List<Performer> idlist = new ArrayList<Performer>(); 
    Scanner sclocal = new Scanner(System.in); 

    if(listperformer.isEmpty() == true) 
    { 
    System.out.println("- empty -"); 
    return; 
    } 
    else 
    { 
    System.out.println("Enter IDs:"); 
    int id; 
    id=sclocal.nextInt(); 

    while(sclocal.hasNext()) 
    { 

    try{ 
    id=sclocal.nextInt(); 
    }catch(InputMismatchException exception) 
    { 
    System.out.println("Invalid input!"); 
    } 

    if(listperformer.size() <= id || id < 0) 
    { 
    System.out.println("Invalid input! 294"); 
    return; 
    } 
    else 
    { 
    idlist.add(listperformer.get(id)); 
    } 
    id=sclocal.nextInt(); 
    } 
    } 

不起作用。問題: 1.

  1. ,如果我把一個錯誤的ID,他問我把在另一併在此之後 拋出一個異常
  2. ,如果我把一個字符串拋出一個「InputMismatchException時」

我們假設,我們列表中只有三個條目。 結果:

Input: 5 
Output: 

Input: 4 
Output: Invalid input! 294 

Input: asdf 
Output: Exception in thread "main" java.util.InputMismatchException... 
+0

你觀察到的「有問題」的用例的工作原理完全一樣,意,或能更好地說 - 因爲它是編碼和預期。 – Shark

+0

爲了更好地理解你的代碼在做什麼,使用幾乎可以肯定內置到IDE(或獨立調試器)中的調試器,並逐步瀏覽代碼。使用調試器是學習編程的重要部分,而非可選部分。 –

回答

1

我改編了幾行,在代碼中添加一些註釋,並且也改變了你的System.out陳述,以反映什麼是真正發生的事情。在你的catch塊中,「sclocal.nextLine()」將消耗導致第一個異常的無效輸入,以便控制可以前進到下一次迭代。

作爲一般指導原則,使用「camelCase」作爲變量名是個好主意。

public static void selection(List<Performer> listperformer) { 
    int i = 0; 
    List<Performer> idlist = new ArrayList<Performer>(); 
    Scanner sclocal = new Scanner(System.in); 

    if (listperformer.isEmpty() == true) { 
     System.out.println("- empty -"); 
     return; 
    } else { 
     int id;//This is being used as an offset, so I recommend you rename it to "offset" 
     System.out.println("Enter ID:"); 

     while (sclocal.hasNext()) { 
      try { 
       id = sclocal.nextInt(); 
       if (listperformer.size() <= id || id < 0) { 
        System.out.println("Invalid input! You requested the element at offset [" + id + "], but the max offset available is [" + (listperformer.size()-1) + "]. Exiting."); 
        return; 
       } else { 
        System.out.println("Input is valid. We have added the offset identifier [" + id + "] to listperformer."); 
        idlist.add(listperformer.get(id)); 
       } 
      } catch (InputMismatchException exception) { 
       System.out.println("Invalid input!"); 
       sclocal.nextLine();//throw away the invalid input so that we can await for the next input 
      } 
      System.out.println("Enter ID:"); 
     } 
    } 
} 
+0

好的,添加所有缺少的信息,可否請再次檢查一次? – Johnny

+0

我重新安排了一些代碼,並添加了一些註釋來使事情順利進行。在這個線程中有關於異常處理的另一個註釋,所以我在代碼中添加了一行代碼,您需要讓整個事情正常工作。 –

0

基於您的代碼,你可能想要的東西更多類似這樣的

while(true){ 
    try{ 
     id=sclocal.nextInt(); 
     if(listperformer.size() <= id || id < 0) { 
      System.out.println("Invalid input! 294"); 
     } 
     else { 
      idlist.add(listperformer.get(id)); 
      break; 
     } 
    } catch(InputMismatchException exception) { 
     System.out.println("Invalid input!"); 
    } 
} 
+0

不起作用,導致無盡的輸出:「輸入無效!294」 – Johnny

1

我看到這裏有兩個問題。

  1. 首先是在第一抓你只打印一個消息到System.out這個你PROGRAMM後會繼續正常運行,從而進入下一個id=sclocal.nextInt()。相反,您應該將函數留在catch子句中。
  2. 現在,在您的try-catch塊後,您再次撥打id=sclocal.nextInt()。這次沒有捕捉到可能的異常,同時從sclocal獲取了全新的值。您可以修復這個問題,即刪除該調用並將if-else子句移入您的try塊。
0

您需要包含全部依賴於try-catch塊中的異常拋出操作的代碼。我將你的代碼擴展到MWE(見下面的輸出)。

import java.util.*; 

public class TryCatch 
{ 
    public static void main(String[] args) 
    { 
     Scanner sclocal = new Scanner(System.in); 
     List<Integer> listperformer = new ArrayList<>(Arrays.asList(1,2,3)); 
     List<Integer> idlist = new ArrayList<>(); 
     try 
     { 
      int id=sclocal.nextInt(); 
      if(listperformer.size() <= id || id < 0) 
      { 
       System.out.println("Invalid input! 294"); 
       return; 
      } 
      else 
      { 
       idlist.add(listperformer.get(id)); 
      } 
     } 
     catch(InputMismatchException exception) 
     { 
      System.out.println("Invalid input!"); 
     } 
    } 
} 

結果

Input: string 
Output: Invalid input! 

Input: 1 
Output: [2] 

Input: 5 
Output: Invalid input! 294 
+0

好吧,會做到這一點! – Johnny